使用代理的导航属性来回导航时,使用NoTracking时出现EF 6错误

时间:2018-02-15 17:02:12

标签: c# entity-framework-6 lazy-loading

在我们的EF 6 Code第一个应用程序中,我们在非跟踪方案中遇到导航属性问题。

要求是:

  • 实体不得附加到上下文并通过NoTracking
  • 检索
  • 必须启用代理生成并且延迟加载正常工作
  • 您必须通过导航属性导航到另一个实体,然后再返回到原始实体

错误消息

  

当使用NoTracking合并选项返回对象时,只能在EntityCollection或EntityReference不包含对象时调用Load。

在代码中,它看起来像这样(未经测试的例子,应该演示必要的部分):

public class A
{
  public virtual ICollection<B> NavigateToB { get; set; }
}

public class B
{
  public virtual A NavigateToA { get; set; }
}

public class AMap : EntityTypeConfiguration<A>
{
  public AMap() 
  {
    this.HasMany(a => a.NavigateToB)
         WithRequired(b => b.NavigateToA);
  }
}

public class BMap : EntityTypeConfiguration<B>
{
  public BMap() 
  {
    this.HasRequired(b => b.NavigateToA)
        .WithMany(a => a.NavigateToB);
  }
}

//Sample
var query= ARepository.GetQuery();
var a= query.AsNoTracking().FirstOrDefault();
var b = a.NavigateToB.FirstOrDefault();
var a2 = b.NavigateToA; //Here the error is thrown

代理对象可以正常工作 - 我可以使用多层次的navigatio属性。当我使用上述异常导航导航属性时,会出现唯一的问题。 这几乎就像第一次使用导航链接已将项目存储在集合中,但未将引用标记为已加载。

有没有什么可以做的 - 如果没有标记为已加载,可能会在延迟加载之前通过反射清除集合?

0 个答案:

没有答案