[英]Identifying and Deleting Entity Framework child records
我在EF中定义了以下对象;
public class ItemA()
{
public virtual ICollection<ItemB> Items{ get; set; }
}
public class ItemB()
{
public virtual ICollection<ItemC> Items{ get; set; }
}
在我的代码中,我正在做以下事情;
myItemA.Items.Remove(myItemA.Items.FirstOrDefault(x => (int)x.Type == model.Type));
myItemA.Items.Add(new ItemB());
当填充ItemA的实例时,它包含单个ItemB,我只想将其替换为ItemB的新实例。 当我进入我的服务更新消息时,我注意到只是调用以下代码导致新的ItemB,并且现有的ItemB变为孤立状态,父ID为null。 ItemB和ItemC之间的链接完好无损。
_dbContext.Entry(entity).State = EntityState.Modified;
_dbContext.SaveChanges();
因此,我知道我需要告诉EF要删除子ItemB,并且模型中的约束设置有望级联删除子ItemC记录,然后删除孤立的ItemB。 但是,我正在努力寻找一种方法。
我尝试从上下文中重新获取Parent ItemA以比较List并将它们标记为已删除,但是当我收回代理时,两个对象基本相同,只有更新的ItemB而不是原始的。
var existingItem = GetItem(entity.Id);
要么
var existing Items = GetItem(entity.Id).Items.ToList();
所以我需要的是原始的ItemA.Items能够告诉EF他们将被删除。 请注意,我知道如何告诉EF应删除某些内容,我只对获取应该删除的实体的引用感兴趣。
编辑
添加此代码使其工作,孤立的ItemB(带有子ItemC)现在被删除,但据我所知,现在将在2个事务中完成。
//Update Message
_dbContext.Entry(entity).State = EntityState.Modified;
_dbContext.SaveChanges();
//Remove any orphaned records
var itemsToRemove = _dbContext.Set<ItemB>().Where(x => x.ItemA == null).ToList();
_dbContext.Set<ItemB>().RemoveRange(itemsToRemove );
_dbContext.SaveChanges();
理想情况下,寻找一种方法来执行此单个SaveChanges()
嗯..我明白了什么不对,或者你只是想实现这样的级联删除:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<ItemB>().HasRequired(b => b.Parent).WithMany(a => a.Items).WillCascadeOnDelete();
}
这应该也有效:
public class ItemA()
{
public virtual ICollection<ItemB> Items{ get; set; }
}
public class ItemB()
{
[Required] // This set's the constraint
public virtual ItemA Parent { get; set; }
public virtual ICollection<ItemC> Items{ get; set; }
}
然而,没有使用第二个,但它应该具有相同的结果。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.