使用.Includes()拋出執行EF6查詢的EntityException

c# entity-framework entity-framework-6

我無法將EF4解決方案遷移到EF6。

我們使用T4模板生成持久無知的POCO,這些POCO具有基於ObservableCollection <T>的導航屬性。

因為我們的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>的自定義類型,它是一個ICollection <T>,那麼為什麼聲明它的異常必須實現ICollection <T>?

如果有人對此有所了解,我將不勝感激,謝謝。

熱門答案

正如EF團隊成員的博文中所解釋的那樣

您的類必須遵循以啟用更改跟踪代理的規則是非常嚴格和限制性的。這限制了您如何定義實體並阻止使用私有屬性甚至私有設置器等內容。

規則是:

  • 該課程必須公開,不得密封。
  • 所有屬性都必須具有公共/受保護的虛擬getter和setter。
  • 集合導航屬性必須聲明為ICollection。它們不能是IList,List,HashSet等。

這個答案解釋了為什麼你不能使用你的實現。




許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因