使用 执行 EF6 查询时引发的实体异常.包括()

本文关键字:异常 实体 包括 EF6 执行 查询 使用 | 更新日期: 2023-09-27 18:37:22

我在将 EF4 解决方案迁移到 EF6 时遇到问题。

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

因为我们的 ObjectContext 实现将实体集公开为 IObjectSet<实体>所以我们从 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 后,我们现在在使用 执行查询时看到以下系统.数据.实体.核心.实体异常。包括() :-

"类型为'DataEntities.Parent'的实体上的导航属性'详细信息'必须实现 ICollection,以便实体框架能够跟踪集合中的更改。

我没有得到的是"Details"属性是一个继承 ObservableCollection它是 ICollection 的自定义类型,那么为什么例外声明它必须实现 ICollection

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

使用 执行 EF6 查询时引发的实体异常.包括()

如EF团队成员的这篇博文中所述

您的类必须遵循的规则才能启用更改跟踪代理,这些规则非常严格且有限制性。这限制了定义实体的方式,并阻止使用私有属性甚至私有资源库等内容。

规则是:

  • 该类必须是公开的,而不是密封的。
  • 所有属性都必须具有公共/受保护的虚拟getter,并且制定。
  • 集合导航属性必须声明为 ICollection。它们不能是 IList、List、HashSet 等。

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