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
}
}
ただし、Eager Loading は正常に動作します。
public void Test_Eager_Loading() {
using (var context = new MyDbContext()) {
var merchant = context.Users.OfType<Merchant>.Include("MerchantLocations").First();
merchant.MerchantLocations.ShouldNotBeNull(); // passes
}
}
MerchantLocations
とマークされているpublic virtual
ので、何が問題なのかわかりません。また、DbContext
コンストラクターに次のコードを追加しました。
Configuration.LazyLoadingEnabled = true;
Configuration.ProxyCreationEnabled = true;
編集: 上記のテストで返されるオブジェクトが EF プロキシではないことにも気付きましたmerchant
。これは単純な ですMerchant
。これが問題の原因であると思われます。
ベストアンサー1
問題は、Merchant クラスがプロキシ生成の要件を満たしていないことだとわかりました。具体的には、保護されたパラメーターなしのコンストラクターを追加する必要がありました。プライベートなコンストラクターしかありませんでした。