我正在创建一个构建映射应用程序,我的数据存储在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)似乎接近我的需要,除了我不想每次都创建新的孩子,我只想把一个孩子(门)从一个父(墙)移到另一个。
我对实体框架相对较新,并且仍然试图将它全部融合在一起,对此的任何帮助都将不胜感激!
当我从前一堵墙的门上拆下门并将其添加到新墙的门系列时,我收到同样的错误。这是我的代码:
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();
}
}