繁体   English   中英

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

[英]EntityException thrown executing EF6 query with .Includes()

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

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

因为我们的ObjectContext实现将实体集公开为IObjectSet <entity>,所以我们失去了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 <T>,以便Entity Framework能够跟踪集合中的更改。”

我没有得到的是'Details'属性,它是一个继承自ObservableCollection <T>的自定义类型,而ObservableCollection <T>是ICollection <T>,那么为什么声明它必须实现ICollection <T>的异常呢?

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

如本EF团队成员的博文所述

您的班级必须遵循的规则才能启用更改跟踪代理,这些规则非常严格和严格。 这限制了您定义实体的方式,并阻止了私有属性甚至私有设置器之类的东西的使用。

规则是:

  • 该课程必须是公开的,而不是密封的。
  • 所有属性都必须具有公共/受保护的虚拟获取程序和设置程序。
  • 集合导航属性必须声明为ICollection。 它们不能是IList,List,HashSet等。

这个答案是为什么不能使用实现的解释。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM