実行される削除操作の数を減らすために、カスケードを使用して親オブジェクトとそのすべての子を削除するコードを作成しています。
だから私はこのような両方のエンティティを持っています
public class Parent
{
public long ParentId { get; set; }
public string ParentName { get; set; }
public virtual ICollection<Child> Children { get; set; }
}
子エンティティは次のようになります
public class Child
{
public long ChildId { get; set; }
public long? ParentId { get; set; }
public string ChildName { get; set; }
}
TypeConfiguration
カスケード削除を使用するために作成します
public class ParentTypeConfiguration : EntityTypeConfiguration<Parent>
{
public ParentTypeConfiguration()
{
this.ToTable("Parents");
this.HasKey(c => c.ParentId);
this.HasMany(c => c.Children)
.WithOptional()
.HasForeignKey(p => p.ParentId)
.WillCascadeOnDelete(true);
}
}
そして、私は行く準備ができています。ここまでは順調ですね。
次のようなテストを作成して、すべてがうまくいっていることを確認します...
[TestMethod]
public void RemoveParentEntity()
{
var parent = new Parent() { ParentName = "name" };
parent.Children = new Collection<Child>();
parent.Children.Add(new Child() { ChildName = "child1" });
parent.Children.Add(new Child() { ChildName = "child2" });
var unitOfWork = new MyUnitOfWork();
var repo = new ParentRepository(unitOfWork);
var count = repo.GetAll().Count();
repo.Add(parent);
repo.UnitOfWork.Commit();
//unitOfWork = new MyUnitOfWork();
//repo = new ParentRepository(unitOfWork);
repo.Remove(cadenaAprobacion);
repo.UnitOfWork.Commit();
var result = repo.GetAll().Count();
Assert.AreEqual(count, result);
}
このテストは次のように言って失敗します:
操作に失敗しました: 1 つ以上の外部キー プロパティが null 非許容であるため、リレーションシップを変更できませんでした。リレーションシップに変更が加えられると、関連する外部キー プロパティが null 値に設定されます。外部キーが null 値をサポートしていない場合は、新しい関係を定義するか、外部キー プロパティに別の非 null 値を割り当てるか、関連のないオブジェクトを削除する必要があります。
だから私はこれをググった/ビンジングしたところ、子オブジェクトが更新されているため、依存プロパティをオプションにする必要があることがわかりました。そのため、エンティティでそれを行い、典型的な子オブジェクトを更新できないなどTypeConfiguration
のエラーが発生しました。DbUpdateException
だから今、私は混乱しています。テストを修正するために、私は2つの異なることができることを知っています:
親オブジェクトを削除する前に、子オブジェクトを削除してください。これにより、データベースでいくつかの操作が行われますが、これは私が望んでいたものではありません。
新しいコンテキストを作成し、親エンティティを取得して、エンティティを削除します。これは問題なく機能し、これらはテストで以前にコメントされた行です。
私の質問は、コンテキストに子コレクションがあり、EF でカスケード削除オプションを使用したい場合、どうすればよいですか? データベースで操作を行わずにオブジェクトをコンテキストから削除するにはどうすればよいですか?
私はコンセプトの問題を抱えていると確信しています。誰かに指摘してもらいたいです。だから私は自分の過ちから学びます:)