29

コレクションをクリアしようとすると (を呼び出す.Clear)、次の例外が発生します。

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

内部例外は次のとおりです。

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

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

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

可用性は次のようになります。

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

構成は次のとおりです。

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

問題の原因となっているコードは次のとおりです。

user.Availability.Clear();

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

4

3 に答える 3

33

それを機能させるために私が知っている唯一の方法は、関係を識別関係として定義することです。Availabilityからの外部キーを外部キーとしてモデルに導入する必要がありUserます...

public int ID { get; set; }
public int UserID { get; set; }
public User User { get; set; }

...そしてそれを主キーの一部にします:

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

マッピングを拡張して、この外部キーを含めることができます (明示的に言うと、EF は慣例により認識されるため、必須ではありません)。

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

(ところで:一方からのみ関係を構成する必要があります。質問にこれらの両方のマッピングを含める必要はありません。)

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

于 2013-07-28T13:29:02.890 に答える
1

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

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

クリアする前に、可用性コレクションの各アイテムに対してこれを実行します。この方法では、「関係を識別する」必要はありません。

于 2014-03-27T06:40:53.907 に答える