使用.Includes()抛出执行EF6查询的EntityException

时间:2013-10-29 14:06:12

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

我无法将EF4解决方案迁移到EF6。

我们使用T4模板生成具有基于ObservableCollection<的导航属性的持久无知POCO。 T>

因为我们的ObjectContext实现将实体集公开为IObjectSet<实体GT;我们从ObjectQuery中丢失了Include()方法,因此必须在IQueryable上使用扩展方法来重新获取它,如下所示:

public static IQueryable<TSource> Include<TSource>(this IQueryable<TSource> source, string path)
{
    IQueryable<TSource> returnValue = source;
    var objectQuery = source as ObjectQuery<TSource>;

    if (objectQuery != null)
    {
        returnValue = objectQuery.Include(path);
    }

    return returnValue;
}

更新解决方案以使用EF6后,我们现在在使用.Include()执行查询时看到以下System.Data.Entity.Core.EntityException: -

“'DataEntities.Parent'类型的实体上的导航属性'Details'必须实现ICollection&lt; T&gt;,以便Entity Framework能够跟踪集合中的更改。”

我没有得到的是'Details'属性是一个自定义类型,它继承了ObservableCollection&lt; T&GT;这是一个ICollection&lt; T>,那么为什么声明它的异常必须实现ICollection&lt; T&GT;

如果有人对此有所了解,我将不胜感激,谢谢。

1 个答案:

答案 0 :(得分:0)

正如本blogpost of an EF team member

所述
  

您的类必须遵循以启用更改跟踪代理的规则是非常严格和限制性的。这限制了您如何定义实体并阻止使用私有属性甚至私有设置器等内容。

规则是:

  • 课程必须公开,不得密封。
  • 所有属性都必须包含公共/受保护的虚拟getter和 setter方法。
  • 必须将集合导航属性声明为ICollection。 它们不能是IList,List,HashSet等。

this answer解释了为什么你不能使用你的实现。