web-dev-qa-db-ja.com

EFコードの最初の遅延読み込みが機能しない

私は最初にEF6でコードを使用していますが、遅延読み込みが機能しないようです。熱心な読み込みが正常に機能しています。次のクラスがあります。

public class Merchant : User
{
    ...

    public virtual ICollection<MerchantLocation> MerchantLocations { get; set; }
}

public class MerchantLocation : BaseEntity
{
    ...

    public int MerchantId { get; set; }
    public virtual Merchant Merchant { get; set; }       
}

public class User : BaseEntity
{
    ...
}

public class BaseEntity
{
    ...

    public int Id { get; set; }
}

次のコードを使用して、場所の遅延読み込みをテストします(失敗します)。

public void Test_Lazy_Loading() {
    using (var context = new MyDbContext()) {
        var merchant = context.Users.OfType<Merchant>.First();
        merchant.MerchantLocations.ShouldNotBeNull(); // fails
    }
}

ただし、熱心な読み込みは正常に機能します。

public void Test_Eager_Loading() {
    using (var context = new MyDbContext()) {
        var merchant = context.Users.OfType<Merchant>.Include("MerchantLocations").First();
        merchant.MerchantLocations.ShouldNotBeNull(); // passes
    }
}

MerchantLocationspublic virtualとマークされているため、問題が何なのかわかりません。また、DbContextコンストラクターに以下を追加しました。

Configuration.LazyLoadingEnabled = true;
Configuration.ProxyCreationEnabled = true;

編集:上記のテストで返されるmerchantオブジェクトがEFプロキシではないことにも気付きました。プレーンなMerchantです。これが問題の原因だと思います。

25
user1032657

Merchantクラスがプロキシ生成の要件を満たしていないことが問題であることに気付きました。具体的には、保護されたパラメーターのないコンストラクターを追加する必要がありました。私はプライベートのものしか持っていなかった。

55
user1032657

遅延読み込みが失敗する原因となる可能性があるもう1つの原因は、仮想ではないナビゲーションプロパティです。これはOPには当てはまりませんでしたが、この質問はGoogleの上位の結果であるため、一部の回答に役立つ場合があります。

そしてさらに別の考えられる原因は存在しないマップされたデータベース列です。データベースの例外をスローするのではなく、レイジーロードを中断することに驚いた。

1
user2880616