1. ホーム
  2. c#

どのようにEFコード最初のデータベースで多くの関連レコードに子1つを削除するには?

2023-09-09 09:17:42

質問

一対多の関連モデルを持っています。

public class Parent
{
    public int Id { get; set; }
    public string Name { get; set; }
    public ICollection<Child> Children { get; set; }
}

public class Child
{
    public int Id { get; set; }
    public string ChildName { get; set; }
}

やりたいことは、クリア Parent.Children をクリアし、データベースから関連する子エンティティを削除することです。私はすでに試してみました。

データベースコンテキストクラス。

modelBuilder.Entity<Parent>()
            .HasMany(p => p.Children)
            .WithOptional()
            .WillCascadeOnDelete(true);

を指定すると、正常に動作しますが、データベース内の冗長なレコードを Parent_Id = null フィールドを持つ冗長なレコードがあります。

parent.Children.Clear();
repository.InsertOrUpdate(parent);

をリポジトリクラスに追加しました。また、同じ動作は私が行うときです。

modelBuilder.Entity<Parent>()
            .HasMany(pr => pr.Children)
            .WithOptional(ri => ri.Parent)
            .WillCascadeOnDelete(true);

に、さらに Parent プロパティに Child クラス

public class Child
{
    ...
    public Parent Parent { get; set; }
    ...
}

をするときや

modelBuilder.Entity<Child>()
            .HasOptional(p => p.Parent)
            .WithMany(p => p.Children)
            .HasForeignKey(p => p.Parent_Id)
            .WillCascadeOnDelete(true);

にParent_Idプロパティを追加して Child クラス

public class Child
{
     ...
     public int Parent_Id { get; set; }
     ...
}

では、どのようにすればカスケード削除を正しく設定できるのでしょうか?あるいは、どのようにそれらの子エンティティを削除することになっているのでしょうか。私はこれがカジュアルなタスクであると仮定しますが、私はちょうど何かを見逃しています。

どのように解決するには?

を削除していないため、カスケード削除は効果がありません。 parent を削除するのではなく、単に InsertOrUpdate . 正しい手順は、例えばこのように、子プロセスを一つずつ削除することです。

using (var context = new MyContext())
{
    var parent = context.Parents.Include(p => p.Children)
        .SingleOrDefault(p => p.Id == parentId);

    foreach (var child in parent.Children.ToList())
        context.Children.Remove(child);

    context.SaveChanges();
}