繁体   English   中英

识别和删除实体框架子记录

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM