0

我无法将 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 能够跟踪集合中的更改。”

我没有得到的是“详细信息”属性是一个自定义类型,它继承了 ObservableCollection<T>,它是一个 ICollection<T>,那么为什么声明它必须实现 ICollection<T> 的异常呢?

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

4

1 回答 1

0

正如EF 团队成员的这篇博文中所解释的那样

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

规则是:

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

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

于 2013-10-29T14:10:23.180 回答