使用 LINQ to SQL 的简单级联删除自引用表
本文关键字:级联 删除 自引用 简单 LINQ to SQL 使用 | 更新日期: 2023-09-27 18:30:21
DELETE 语句与同一表引用约束冲突 "FK_AuthCategories_Parent"。冲突发生在数据库"MyDB"中, 表"dbo。身份验证类别", 列"父 ID"。
如果我尝试删除具有 ParentID 的自引用 FK 的表中的所有内容,我会收到上面的错误,即我需要首先删除子项(即它尝试删除具有子项的父项破坏 FK)。
var dc = from c in db.AuthCategories
select c;
db.AuthCategories.DeleteAllOnSubmit(dc);
db.SubmitChanges();
是否有一个简单的 LINQ to SQL 查询,可以在处理级联删除时删除表中的所有内容?
- 不想使用 SQL 服务器端解决方案,例如触发器或删除级联
- 需要使用 LINQ to SQL,而不是 EF
- 希望它尽可能简单,如果可能的话是一行
下面是表结构:
[Table(Name = "AuthCategories")]
public class AuthCategory
{
[Column(IsPrimaryKey = true, IsDbGenerated = true)]
public int ID { get; set; }
[Column]
public string Name { get; set; }
[Column]
private int? ParentID { get; set; }
private EntityRef<AuthCategory> parent;
[Association(IsForeignKey = true, ThisKey = "ParentID")]
public AuthCategory Parent
{
get { return parent.Entity; }
set { parent.Entity = value; }
}
}
好的,咖啡开始了,这有效:
将子项 IEnumerable 添加到类:
private EntitySet<AuthCategory> children = new EntitySet<AuthCategory>();
[Association(Storage = "children", OtherKey = "ParentID")]
public IEnumerable<AuthCategory> AuthCatChildren
{
get { return children; }
}
public IEnumerable<AuthCategory> Children
{
get { return (from x in AuthCatChildren select x).AsEnumerable(); }
}
现在,您可以通过while
循环先删除子项:
// Loop, Deleting all rows with no children (which would delete childless parents and nested grandchild/children)
int loop = 1;
while (loop > 0)
{
var dbList = from c in db.AuthCategories.ToList()
where c.Children.Count() == 0
select c;
loop = dbList.Count();
db.AuthCategories.DeleteAllOnSubmit(dbList);
db.SubmitChanges();
}