EF7がナビゲーションプロパティを熱心に修正するのを防ぐにはどうしたらいいですか?

entity-framework-core

質問

私はいくつかの助けを使うことができるウェブアプリケーションでEF7を使って問題があります。私は現在EF7 RC1を使用しています。

ここに私の問題を説明するいくつかのモデルがあります。

接触

public class Contact
{
    public Guid Id { get; set; }

    public string Desc { get; set; }
    public ContactType ContactType { get; set; }
}

ContactType

public class ContactType
{
    public Guid Id { get; set; }
    public string Desc { get; set; }

    public ICollection<Contact> Contacts { get; set; }
}

これらのモデルは、Fluent APIを介して次のように関連しています。

modelBuilder.Entity<Contact>(entity => {
     // abridged for clarity

     entity
        .HasOne(c => c.ContactType)
        .WithMany(ct => ct.Contacts)
        .IsRequired();                
});

私のニーズは、ContactTypeプロパティをロードして、データベースからContactエンティティのコレクションを取得できることです。 EFはこれを非常に簡単にします:

using(var context = new MyDbContext()) {
    var contacts = await context
        .Contacts
        .Include(c => c.ContactTypes)
        .Where(/* some search criteria */)
        .ToListAsync();
}

問題は、問い合わせ内の.Include()の呼び出しのために発生する連絡先エンティティのContactTypeプロパティを読み込む際に、各ContactTypeエンティティのContactsプロパティを便利に読み込んで、連絡先が無限にチェーンされていることです連絡先を指すContactTypesとContactTypesでなぜこれがデフォルトの振る舞いで、多くの場合役に立ちますが、これらのエンティティをJSONにシリアル化してクライアントに送信する必要があります。これは読み取り専用の状況です。

私の望ましい動作は、EFが、Contactsプロパティがnullに設定されている(nullではない)ロードされたContactTypeプロパティを持つ連絡先のコレクションを返すことです。これはEFができることですか?オブジェクトグラフで終わる方法はありますか?手作業で不必要なプロパティを無効にしたくないのですか?

私が試したこと:

  • EFクエリに.AsNoTracking()を追加する(ContactTypeエンティティのContactsプロパティをロードしないように見えない)
  • Json.NETに無限の参照ループを直列化しないように伝える(これは直列化中に無限再帰を避けるために必要ですが、依然として多くの余分なデータが直列化されます)

受け入れられた回答

ContactType.Contactsコレクションを読み込むのを避けることはできません。実際には読み込まず、読み込まれたContactインスタンスでコレクションを埋めているからです。このため、AsNoTrackingを使用するのは、遅延ロードやChangeTrackerの問題ではないためです。

次の3つの解決策があります。

  1. Json.NET ReferenceLoopHandling = ReferenceLoopHandling.Ignore使用しますが、あなたが述べたように、すべてのContactTypeの連絡先のコレクションを取得するので、不必要なデータがたくさん生成されます
  2. ContactType.Contactsに[JsonIgnore]属性を使用すると[JsonIgnore]で無視されます。しかし、それは常にそれを無視する、私はあなたが他の状況でそれを必要とするかわからない
  3. DTOを定義し、Automapperのようなものを使用して、連絡先のコレクションなしでデータをマップし、シリアル化します

私はクライアントにドメインモデルオブジェクトを送信するのが好きではなく、ドメインに関連しないドメインモデルに属性を追加することを避けたいので、3番目のオプションを好むでしょう。


人気のある回答

私は同じ質問を持っていますEntity Framework 7コア無効にする自動読み込み

私はAsNoTracking()を追加します。

IQueryable<ScheduleModel> q = _db.Schedules;
q = q.AsNoTracking();
q = q.Include(x => x.ElementItem);
q = q.Include(x => x.ScheduleHours);

プロパティは現在自動的に設定されません。



Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ