2013-07-25 13 views
22
私は次の例外を取得( .Clearを呼び出す)コレクションクリアしようとしています

:彼らの関係のために外部キープロパティを公開していないエンティティを保存中にエラーが発生した関係が削除された状態にある

を。 EntityEntriesプロパティは、単一のエンティティが例外のソースとして識別できないため、nullを返します。エンティティタイプに外部キーのプロパティを公開することで、保存時の例外処理を簡単に行うことができます。詳細については、InnerExceptionを参照してください。

内部例外がある:

'User_Availability' AssociationSetから関係は '削除済み' 状態にあります。多重度の制約がある場合、対応する 'User_Availability_Target'も 'Deleted'状態でなければなりません。

ユーザーは次のようになります。

.... 
ICollection<Availability> Availability { get; set; } 

入手可能性は、次のようになります。問題の原因となったコードが

HasMany(x => x.Availability).WithRequired(x => x.User); 
HasRequired(x => x.User).WithMany(x => x.Availability); 

です

次のように

int ID { get; set; } 
User User { get; set; } 
DateTime Start { get; set; 
DateTime End { get; set; } 

設定があります

user.Availability.Clear(); 

DbSetを使用してアイテムを削除するなど、他の方法を検討しましたが、コードがきれいであるとは思われません。コレクションをクリアすることでこれを達成する方法はありますか?

答えて

22

私がそれを動作させることを認識している唯一の方法は、関係をidentifying relationshipとして定義することです。それは...あなたのモデルに外部キーとしてUserAvailabilityから外部キーを導入する

public int ID { get; set; } 
public int UserID { get; set; } 
public User User { get; set; } 
を必要と...、それ主キーの一部になるだろう:

modelBuilder.Entity<User>() 
    .HasKey(u => new { u.ID, u.UserID }); 

することができます

modelBuilder.Entity<User>() 
    .HasRequired(x => x.User) 
    .WithMany(x => x.Availability) 
    .HasForeignKey(x => x.UserID); 

(ところで:あなたが設定する必要があり、この外部キーを(ちょうど明示されるように、EFは、慣例により、それを認識しますので、それが必要とされていない)を含むようにあなたのマッピングを拡張一側からの関係のみを確かめてください。これらのマッピングが両方とも必要ではありません。

user.Availability.Clear();でコレクションをクリアすると、Availabilityのエンティティがデータベースから削除されます。

+1

スラマに感謝、私の問題を解決しました。 – Sam

+0

投稿していただきありがとうございます!子オブジェクトの更新を実行すると、FKプロパティとナビゲーションプロパティのために同じ列に複数のSETステートメントが表示されます。 1つのSET文を生成するしかないのですか? – Thomas

+0

@トーマス:私は手がかりがありません。 SQLの生成は、EFの手元にあり、制御が難しいです。同じFK列に対して2つのSET式が得られるのは、実際には驚いています。 EFはFKの物件とナビを知っているはずです。プロパティは、同じFK列と関係を表します。 – Slauma

0

トリックが1つあります。あなたは特別なDbSetを使用せずに、エンティティを削除することができます。

(this.dataContext as IObjectContextAdapter).ObjectContext.DeleteObject(entity); 

は、それをクリアする前に、可用性、コレクション内の各項目に対してこれを実行します。この方法では、「関係を特定する」必要はありません。

関連する問題