2016-10-04 7 views
0

私は1対nの関係を持つ2つのテーブルを持っています。 MyOtherはMyPrimaryを持っている必要がありますし、独自に存在することはできません - primary_id私は.WithRequired()に関係を設定する理由でもあります、非NULL可能列であることを私はCascadeOnDeleteを持っていますが、外来キーIDはNULL可能でなければなりません

modelBuilder.Entity<MyPrimary>() 
      .HasMany(x => x.MyOthers) 
      .WithRequired() 
      .HasForeignKey(x => x.primary_id) 
      .WillCascadeOnDelete(); 

注:私は、次のEFコードファーストの関係定義を使用しました。

今、私は次のコードを持っている:

myPrimary.MyOthers.Clear(); 
ctx.SaveChanges(); 

をそして、私は次の例外受け取る:

のSystem.InvalidOperationException:操作は失敗しました:一つ以上のための関係は変更できませんでしたが外部キーのプロパティはnull値ではありません。リレーションシップが変更されると、関連する外部キー・プロパティーはNULL値に設定されます。外部キーがNULL値をサポートしていない場合は、新しい関係を定義する必要があります。また、外部キー・プロパティーに別の非NULL値を割り当てる必要があります。

なぜですか? myPrimary.MyOthersのすべてのMyOtherインスタンスがカスケード削除されるべきではないため、nullを許可しないFKは問題ではありませんか?

答えて

1

.Clear() EF MyPrimaryからMyOtherの割り当てを解除しようとすると、MyOtherレコードを削除したいことが分かりません。おそらくクリアした後、これらのMyOtherレコードを別のMyPrimaryレコードに追加することになります。したがって、これらのレコードを明示的に削除してマークする必要があります。あなたはこの

public void MarkForDeleteItems<T>(ICollection<T> collection) where T : class 
{ 
    foreach (var collectionItem in collection.ToList()) 
    { 
     ctx.Entry(collectionItem).State = EntityState.Deleted; 
    } 
} 

と同様の方法を記述し、それ

MarkForDeleteItems(myPrimary.MyOthers); 
ctx.SaveChanges(); 

またWillCascadeOnDeleteはあなたがMyPrimaryに関連するすべてのMyOthersレコードを削除するデータベースよりMyPrimaryレコードを削除するとことを意味使用することができます。

+0

「これらのMyOtherレコードを別のMyPrimaryレコードに追加することをお勧めします。 - ありがとう、それは私が欠けていた点です。今はすべてがクリアです! –

関連する問題