如何首先删除EF6代码中实体之间的关系



对象 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;

我想从拥有对象中删除 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 相关

这似乎并不难做到。但是我找不到任何解决方案

好的。我发现的唯一解决方案是在添加或删除项目后调用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();是解决这个问题的最简单方法

最新更新