如何删除 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();是解决这个问题最简单的方法