2

DELETE ステートメントは、SAME TABLE REFERENCE 制約 "FK_AuthCategories_Parent" と競合しました。データベース「MyDB」、テーブル「dbo.AuthCategories」、列「ParentID」で競合が発生しました。

ParentID の自己参照 FK を持つテーブル内のすべてを削除しようとすると、基本的に最初に子を削除する必要があるという上記のエラーが表示されます (つまり、FK を壊す子を持つ親アイテムを削除しようとします)。

var dc = from c in db.AuthCategories
         select c;
db.AuthCategories.DeleteAllOnSubmit(dc);
db.SubmitChanges();

カスケード削除を処理しながらテーブル内のすべてを削除する単純な LINQ to SQL クエリはありますか?

  • Triggers や ON DELETE CASCADE などの SQL サーバー側のソリューションを使用したくない
  • EF ではなく LINQ to SQL を使用する必要がある
  • できればワンライナーで、できるだけシンプルにしたい

テーブル構造は次のとおりです。

[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; }
    }
}
4

1 に答える 1

2

わかりました、コーヒーが始まりました、これはうまくいきます:

Children 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();
}
于 2013-09-05T13:22:19.467 に答える