EF Code First Lazy loading不工作

use*_*657 24 c# entity-framework lazy-loading

我首先使用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; }
}
Run Code Online (Sandbox Code Playgroud)

我通过以下代码测试我的延迟加载位置(失败):

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

然而,急切的加载工作正常:

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

MerchantLocations标记为,public virtual所以我不确定问题是什么.我还在DbContext构造函数中添加了以下内容:

Configuration.LazyLoadingEnabled = true;
Configuration.ProxyCreationEnabled = true;
Run Code Online (Sandbox Code Playgroud)

编辑:我也注意到merchant在上面的测试中返回的对象不是EF代理.这很简单Merchant.我怀疑这是导致问题的原因.

use*_*657 52

我意识到问题是Merchant类不符合代理生成的要求.具体来说,我需要添加一个受保护的无参数构造函数.我只有一个私人的.

  • 你救了我的命. (8认同)
  • 同样在这里!另一个生命救了:) (4认同)
  • 我有公共无参数构造函数但仍然无法正常工作 (4认同)

use*_*616 5

另一件可能导致延迟加载失败的事情是非虚拟的导航属性。OP 的情况并非如此,但这个问题是 Google 的热门结果,所以它可能会对一些人有所帮助。

另一个可能的原因是映射的数据库列不存在。我很惊讶地发现它打破了延迟加载而不是抛出数据库异常。