C# EF6延迟加载不';在急着加载的情况下不工作很好

C# EF6延迟加载不';在急着加载的情况下不工作很好,c#,entity-framework-6,C#,Entity Framework 6,我将我的应用程序从EF4.1更新到EF6,现在我遇到了延迟加载问题。我使用EF6.xDbContext生成器生成新的DbContext。所有由此得出的建议也适用 我的课是公开的 不是密封的,不是抽象的 有一个公共构造函数 不要实现ientitywhithchangetracker或ientitywhithrelationships ProxyCreationEnabled和LazyLoadingEnabled都设置为true 导航属性是虚拟的 在我看来也很奇怪的是,如果我用include(“

我将我的应用程序从EF4.1更新到EF6,现在我遇到了延迟加载问题。我使用EF6.xDbContext生成器生成新的DbContext。所有由此得出的建议也适用

  • 我的课是公开的
  • 不是密封的,不是抽象的
  • 有一个公共构造函数
  • 不要实现
    ientitywhithchangetracker
    ientitywhithrelationships
  • ProxyCreationEnabled
    LazyLoadingEnabled
    都设置为true
  • 导航属性是虚拟的
在我看来也很奇怪的是,如果我用
include(“…”)
显式地包含导航属性,它就会被加载

我的POCOs和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; }
}
公共部分类思维
{
公众思想()
{
}
公共长Id{get;set;}
公共可为空的ChallengeId{get;set;}
公共虚拟质询{get;set;}
}
公开部分班级挑战赛
{
公众挑战()
{
this.Ideations=newhashset();
}
公共长Id{get;set;}
公共虚拟ICollection Ideations{get;set;}
}
公共部分类boxenties:DbContext
{
公共图书馆实体()
:base(“name=BoxEntities”)
{
}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
抛出新代码FirstException();
}
公共虚拟数据库集构思{get;set;}
公共虚拟数据库集挑战{get;set;}
}
我还试图在没有运气的情况下显式地设置
ProxyCreationEnabled
LazyLoadingEnabled
。实体未作为动态代理加载,此调试会话屏幕截图显示:


我还缺什么

根据@ken2k的评论,从EF 4开始的新模型的默认设置是默认启用延迟加载。对于EF 1,这是不允许的。如果将模型从1移植到4,则默认情况下,该模型处于禁用状态。您需要修改上下文才能打开它


也就是说,您通过调试表明这是真的。在这种情况下,请检查您的使用场景。是否可能在获取子对象之前已释放了您的上下文。通常,当数据绑定到LINQ查询时,我们会看到这种情况,其中上下文在Using块中配置,实际迭代直到Using块的作用域通过后才会发生。

可能发生这种情况的情况是,您试图加载的
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);
}
anotherIdeation
将是已附加的非代理,不能延迟加载。使用
var-anotherIdeation=context.Ideations.SingleOrDefault(i=>i.Id==1)运行DB查询甚至没有帮助
因为查询的默认合并选项是
AppendOnly
,即,只有在尚未附加具有该键的实体时,才会添加新实体。因此,
另一个定义
仍然是非代理

在调用
GetById
方法中的
Find
之前,可以使用
Local
检查实体是否已附加:

bool isIdeationAttached = context.Ideations.Local.Any(i => i.Id == id);

你能发布一个DbContext类的(简化)副本吗?@ken2k,我已经添加了它。乍一看,我没有发现任何错误。如何配置ObjectContext?另外,您是否使用模型优先的方法?对不起,我现在真的不知道:(你的上一个截图显示了非常简单的代码,没有上下文处理……等等。我对你的问题投了赞成票,希望有人能找出问题所在。真的,我觉得一切都很好,我不知道为什么不创建代理。我建议直接在问题中添加你的上一个截图,它添加了很多关于如何创建代理的信息。)u对上下文的访问。我试图在没有运气的情况下显式设置LazyLoadingEnabled。此外,上下文生存期是每个请求的,因此在提取子对象时尚未处理。这是实际情况。非代理实体已附加到
DbContext
。非常感谢!