2017-09-20 9 views
2

ナビゲーションプロパティをnullに設定すると、参照されるオブジェクトも自動的に削除されるように、1 : 0..1のEF 6.xとの関係を設定する方法はありますか?1:0..1の関係を設定すると、参照をnullにすると自動的に参照されたオブジェクトが削除されます。

例:適切

Student may have 0..1 StudentDetails 

var student = new Student(); 
student.Details = new StudentDetails(); 
dbContext.Students.Add(student); 
... 
student.Details = null; 
dbContext.SaveChanges(); // should automatically delete the StudentDetails object 

セットアップ方法の関係?私の現在の試みは、次のとおりです。ただし

modelBuilder.Entity<Student>() 
     .HasOptional(x => x.Details) 
     .WithRequired(); 

、動作しないこと:(

+0

これはデータベースの最初のコードですか、コードの最初のコードですか? –

+0

コードの最初の流暢な設定 –

+0

'dbContext.StudentDetails.Remove(student.Details);'エンティティをnullに設定すると、自分の知る限り、EFは何もしません。 –

答えて

2

関係の設定が正しいであり、所望の動作を生成する必要があります(私はカスケードが、それによって削除できるようにするためにWillCascadeOnDelete()を追加することを示唆しています

ただし、コンテキストによって変更として検出されるためにnullに設定する前にDetailsプロパティをロードする必要がありますの間にトラッカーを変更してデータベースから削除しました呼び出し。

これはいくつかの方法で行うことができます。例えば、エンティティの検索時に熱心な負荷は:

var student = dbContext.Students 
    .Include(s => s.Details) // <-- 
    .FirstOrDefault(s => s.Id == ...); 

またはそれにアクセスしてロードされた(遅延ロードが有効になっている場合)怠惰:場合

var details = student.Details; 

または明示的な読み込み、それをあなたは知りませんそれが取得されていますし、遅延ロードが無効になってどのように:

dbContext.Entry(student).Reference(s => s.Details).Load(); 

あなたがやると、その問題のコード

student.Details = null; 
dbContext.SaveChanges(); 

は、データベースから既存の詳細レコードを削除します。

関連する問題