【问题标题】:remove row in parent-child table in Entity framework在实体框架中删除父子表中的行
【发布时间】:2017-09-22 18:44:39
【问题描述】:

我有一个表(代码优先,EF6,Sql Server):

public int Srl { get; set; }
public StringName{ get; set; }
public Nullable<int> Parent { get; set; }

我想删除表中带有特殊Srl 的行及其所有子项。请注意,一行的孩子可能是这样的:

row->
    Child1->
            Child1-1
    Child2->
    Child3->
           Child3-1
           Child3-2->
                   Child3-2-1
    Child4

我写这个方法:

private void DeleteObjectAndChildren(int id)
        {
            var menu = db.Menus.Where(m => m.Parent == id).ToList();
            foreach (var item in menu)
            {
                var child = db.Menus.Where(m => m.Parent == item.Srl).ToList();

                if (child.Count != 0)
                {
                    DeleteObjectAndChildren(item.Srl);
                }
                else
                {
                    db.Menus.Remove(item);
                }
            }
            db.SaveChanges();
        }

代码运行没有错误,但数据库中没有任何变化。任何人都知道我的错吗?

任何人都可以建议更好的方法来删除一行及其所有子项吗?

【问题讨论】:

  • 你能发布完整的实体模型吗?现在的方式(没有任何导航属性),我看不出你如何定义关系。

标签: c# sql-server entity-framework


【解决方案1】:

其中一种方法,找到孩子后可以删除。

MyDbContext db = new MyDbContext();
public List<Menus> GetChildren(int id)
{
    return db.Menus.Where(i => i.Parent == id || i.Id == id).ToList().Union(db.Menus.Where(i => i.Parent == id).ToList().SelectMany(i => GetChildren(i.Id)).ToList()).ToList();            
}
public void DeleteMenus(int id)
{
    GetChildren(id).ForEach(i => db.Entry(i).State = System.Data.Entity.EntityState.Deleted);
    db.SaveChanges();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-19
    • 1970-01-01
    • 1970-01-01
    • 2011-05-08
    相关资源
    最近更新 更多