更改已分离子对象的父级 - 实体框架6

时间:2018-05-01 18:14:12

标签: c# .net entity-framework-6

我正在创建一个构建映射应用程序,我的数据存储在SQL Server Express数据库中,当我更改子对象中的父ID时,遇到了保存相关实体的麻烦。

简单来说,我有一个'Wall'类和一个'Door'类,每个Door属于一个Wall,如下所示。

public class Wall() {
  public int ID { get; set; }
  public virtual ICollection<Door> Doors { get; set; }
}

public class Door() {
  public int ID { get; set; }
  public int WallID { get; set; }
  public virtual Wall Wall { get; set; }
}

我试图在运行时将一扇门从一个墙移到另一个墙(即最终用户想要移动门),我试着这样做:

private void MoveDoor() 
{
   // doorToMove was previously loaded from the context but is detached now while the user makes updates
   // user changes location of door:
   doorToMove.WallID = wallToMoveTo.ID;
   SaveDoor(doorToMove);
}

private void SaveDoor(Door door) 
{
   using (var db = new BuildingDataContext())
   {
      db.Entry(door).State = EntityState.Modified;
      db.SaveChanges();
   }
}

但是,当门的实体状态更改为EntityState.Modified时,我收到此错误消息:

'发生了引用完整性约束违规:关系一端的“Wall.ID”的属性值与另一端的“Door.WallID”的属性值不匹配。

我试过从前一堵墙的门上拆下门,然后将它添加到新墙的门上,但这没有用。我让它工作的唯一方法是,如果我从数据库查询门,然后更新它的WallID,如下所示:

private void SaveObject(Door door) 
{
   using (var db = new BuildingDataContext())
   {
      Door findDoor = db.Doors.Find(door.ID);
      findDoor.WallID = door.Wall.ID;
      db.Entry(findDoor).State = EntityState.Modified;
      db.SaveChanges();
   }
}

但是,门的其他属性也会发生变化,因此我不想在更改的门和数据库中的门之间逐个手动更新属性。

我查看了很多文章/帖子,发现了一些有用但不足以完全解决我的问题。这篇文章(Cleanly updating a hierarchy in Entity Framework)似乎接近我的需要,除了我不想每次都创建新的孩子,我只想把一个孩子(门)从一个父(墙)移到另一个。

我对实体框架相对较新,并且仍然试图将它全部融合在一起,对此的任何帮助都将不胜感激!

UPDATE:

当我从前一堵墙的门上拆下门并将其添加到新墙的门系列时,我收到同样的错误。这是我的代码:

private void MoveDoor() 
{
   // doorToMove was previously loaded from the context but is detached now while the user makes updates
   // user changes location of door:
   doorToMove.Wall = newWall;
   prevWall.Doors.Remove(doorToMove);
   newWall.Doors.Add(doorToMove);
   // Other properties of door could be edited here (coordinates, width, etc) 
   SaveDoor(doorToMove, prevWall, newWall);
}

private void SaveDoor(Door door, Wall prevWall, Wall newWall) 
{
   using (var db = new BuildingDataContext())
   {

      db.Entry(prevWall).State = EntityState.Modified; // Errors here
      db.Entry(newWall).State = EntityState.Modified;
      db.Entry(door).State = EntityState.Modified; // I still need to save the door to save other properties that may have been changed
      db.SaveChanges();
   }
}

0 个答案:

没有答案