2016-09-02 5 views
2

私は次のように2つのエンティティを持っている:Entity Frameworkのナビゲーションコレクションプロパティ削除

public class FirstEntity 
{ 
    public int Id { get; set; } 

    public ICollection<SecondEntity> SecondEntityCollection { get; set; } 
} 

public class SecondEntity 
{ 
    [Key] 
    [Column(Order = 0)] 
    public int FirstEntitySomeId { get; set; } 

    [Key] 
    [Column(Order = 1)] 
    public int SecondEntityId { get; set; } 
} 

マイModelBuilder次私はFirstEntityオブジェクトを削除する場合

modelBuilder.Entity<FirstEntity>() 
      .HasMany(x => x.SecondEntity) 
      .WithRequired() 
      .HasForeignKey(x => x.FirstEntitySomeId); 

を以下のように設定されます。

var firstEntity=this.context.FirstEntities.Where(x=>x.Id==someId); 
firstEntity.SecondEntityCollection.Clear(); 
this.context.FirstEntities.Remove(firstEntity); 
this.context.SaveChanges(); 

しかし、まだ次の例外があります。

DELETEステートメントがREFERENCE制約 "...."と競合しました。競合は、データベース "データベース"、テーブル "dbo.SecondEntity"、列 "FirstEntitySomeId"で発生しました。

firstEntityオブジェクトを削除する前にコレクションを適切に消去するにはどうすればよいですか?

私はを回避しようとしていることを言及する価値があります。カスケード削除。私は、データベース内の孤立したエントリを削除したいと思います。しかし、最良の解決策/実践がカスケード削除を使用する場合は、私はそれを使用します。

これは可能ですか?

+0

「私はカスケード削除を避けようとしています。」つまり、孤児データをデータベースに保存する必要がありますか? – Sampath

+0

いいえ、コレクションの子エントリも削除します。私は今、 'WillCascadeOnDelete()'の使用を避けようとしています。しかし、これが最善の選択肢なら、私はそれを使用します。 – pgerchev

答えて

1

次のように試してみてください。

var firstEntity=this.context.FirstEntities 
         .Where(x=>x.Id==someId) 
         .Include(s => s.SecondEntityCollection); 

this.context.FirstEntities.Remove(firstEntity); 

foreach (var s in firstEntity.SecondEntityCollection.ToList()) 
    { 
    this.context.SecondEntityCollection.Remove(s); 
    } 

this.context.SaveChanges(); 
+0

'firstEntity.SecondEntityCollection.Count()'は0で、 'SecondEntity'子が​​削除されていないことを意味します。私はなぜ 'SecondEntityCollection'が空であるのか分かりません。 – pgerchev

+0

申し訳ありませんが、私はあなたが言ったことを得ていない?これは問題ないのですか? – Sampath

+0

申し訳ありませんが、私は十分に明確ではありませんでした。 'firstEntity.SecondEntityCollection.ToList()'は空のコレクションを返します。つまり、 'SecondEntityCollection'の中にアイテムが存在しないので、削除は起こっていません。 – pgerchev

関連する問題