如何删除 EF6 代码优先中实体之间的关系?
How can I remove relationship between entities in EF6 code-first?
我在对象 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();
抛出异常:
A referential integrity constraint violation occurred: The property value(s) of 'B.Id' on one end of a relationship do not match the property value(s) of 'A.OwnerId' on the other end.
我无法删除对象 A 并在没有 Owner 的情况下创建另一个对象,因为还有许多其他对象与 A 相关
好像没那么难做。但是我找不到任何解决方案
好的。我发现唯一的解决方案是在添加或删除项目后调用 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();
是解决这个问题最简单的方法
我在对象 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();
抛出异常:
A referential integrity constraint violation occurred: The property value(s) of 'B.Id' on one end of a relationship do not match the property value(s) of 'A.OwnerId' on the other end.
我无法删除对象 A 并在没有 Owner 的情况下创建另一个对象,因为还有许多其他对象与 A 相关
好像没那么难做。但是我找不到任何解决方案
好的。我发现唯一的解决方案是在添加或删除项目后调用 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();
是解决这个问题最简单的方法