急切加载工作正常时,EF6延迟加载不起作用

Den*_*nko 5 c# entity-framework-6

我将我的应用程序从EF4.1更新为EF6,现在我有延迟加载问题.我使用EF6.x DbContext Generator来生成新的DbContext.所有的这个建议的文章也适用.

  • 我的课程是公开的
  • 没有密封,没有抽象
  • 有一个公共构造函数
  • 不要既不实施IEntityWithChangeTracker也不实施IEntityWithRelationships
  • 双方ProxyCreationEnabledLazyLoadingEnabled设置为true
  • 导航属性是虚拟的

对我来说看起来也很奇怪的是,如果我明确地包含导航属性,Include("...")那么它就会被加载.

我的POCO和DbContext的简化版本:

public partial class Ideation
{
    public Ideation()
    {

    }

    public long Id { get; set; }
    public Nullable<long> ChallengeId { get; set; }

    public virtual Challenge Challenge { get; set; }
}

public partial class Challenge
{
    public Challenge()
    {
        this.Ideations = new HashSet<Ideation>();
    }

    public long Id { get; set; }

    public virtual ICollection<Ideation> Ideations { get; set; }
}

public partial class BoxEntities : DbContext
{
    public TIBoxEntities()
        : base("name=BoxEntities")
    {

    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        throw new UnintentionalCodeFirstException();
    }

    public virtual DbSet<Ideation> Ideations { get; set; }
    public virtual DbSet<Challenge> Challenges { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

此外,我试图设置ProxyCreationEnabledLazyLoadingEnabled明确没有运气.该实体未加载为动态代理,因为此调试会话屏幕截图显示:

调试

我还缺少什么?

Sla*_*uma 4

可能发生这种情况的情况是,您尝试加载的实体Find已经作为非代理对象附加到上下文。例如:

using (var context = new MyContext())
{
    var ideation = new Ideation { Id = 1 }; // this is NOT a proxy
    context.Ideations.Attach(ideation);

    // other stuff maybe ...

    var anotherIdeation = context.Ideations.Find(1);
}
Run Code Online (Sandbox Code Playgroud)

anotherIdeation将是已附加的非代理,并且它不能够延迟加载。它甚至无法帮助运行数据库查询,var anotherIdeation = context.Ideations.SingleOrDefault(i => i.Id == 1);因为查询的默认合并选项是AppendOnly,即只有在尚不存在具有该键的附加实体时才会添加新实体。因此,anotherIdeation仍然是非代理。

Local您可以在调用方法之前Find使用以下命令检查实体是否已附加GetById

bool isIdeationAttached = context.Ideations.Local.Any(i => i.Id == id);
Run Code Online (Sandbox Code Playgroud)