我在对象A和B之间有一对多的关系。
public class A
{
public int Id { get; set; }
public int? OwnerId { get; set; }
public B Owner { get; set; }
}
public class B
{
public int Id { get; set; }
public ObservableCollection<A> OwnedObjects { get; set; }
}
我有
AutoDetectChangesEnabled = false;
ProxyCreationEnabled = false;
我想从OwnedObjects中删除A,但不从数据库中删除。
这样:
var b = Bs.Find(id);
Entry(b).Collection(_=>_.OwnedObjects).Load();
var someObjToRemove = b.OwnedObjects[0];
b.OwnedObjects.Remove(someObjToRemove);
Entry(b).State = EntityState.Modified;
SaveChanges();
无效
这样:
var b = Bs.Find(id);
Entry(b).Collection(_=>_.OwnedObjects).Load();
var someObjToRemove = b.OwnedObjects[0];
someObjToRemove.OwnerId = null;
Entry(someObjToRemove).State = EntityState.Modified;
SaveChanges();
抛出异常:
发生了引用完整性约束违规:关系一端的“B.Id”的属性值与另一端的“A.OwnerId”的属性值不匹配。
我无法删除对象A并创建另一个没有所有者的对象,因为还有许多与A
相关的其他对象这似乎并不那么难。但我找不到任何解决方案
答案 0 :(得分:1)
确定。只有解决方案我才发现在添加或删除项目后调用ChangeTracker.DetectChanges();
。
var itemToAdd = As.Find(a1.Id);
b.OwnedObjects.Add(itemToAdd);
var itemToRemove = As.Find(a2.Id);
b.OwnedObjects.Remove(itemToRemove);
ChangeTracker.DetectChanges();
SaveChanges();
效果很好。但ChangeTracker.Entries()包含A
修改后的仅个实例。如果我用
ChangeTracker.DetectChanges()
Entry(itemToAdd).State = EntityState.Modified;
Entry(itemToRemove).State = EntityState.Modified;
它不再起作用。
所以我认为,调用ChangeTracker.DetectChanges();
是解决这个问题最简单的方法