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

时间:2015-03-15 13:26:46

标签: c# entity-framework 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();

抛出异常:

  

发生了引用完整性约束违规:关系一端的“B.Id”的属性值与另一端的“A.OwnerId”的属性值不匹配。

我无法删除对象A并创建另一个没有所有者的对象,因为还有许多与A

相关的其他对象

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

1 个答案:

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