EntityExceptionが.Includes()でEF6クエリを実行してスローされました

c# entity-framework entity-framework-6

質問

私は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が表示されます。

"Entity Frameworkがコレクションの変更を追跡できるようにするには、タイプ 'DataEntities.Parent'のエンティティのナビゲーションプロパティ 'Details'でICollection <T>を実装する必要があります。

私が得ないのは、 'Details'プロパティがObservableCollection <T>を継承するカスタムタイプであるということです。なぜなら、ICollection <T>を実装しなければならないという例外はなぜですか?

誰かがこれを流す光があれば、感謝します。ありがとう。

人気のある回答

EFチームメンバーのこのblogpostで説明されているように

変更追跡プロキシを有効にするためにクラスが従わなければならないルールは非常に厳しく制限的です。これはエンティティの定義方法を制限し、プライベートプロパティやプライベートセッターなどの使用を制限します。

ルールは次のとおりです。

  • クラスは公開され、封印されていないことが必要です。
  • すべてのプロパティにはパブリック/保護された仮想ゲッターとセッターが必要です。
  • コレクションナビゲーションプロパティは、ICollectionとして宣言する必要があります。 IList、List、HashSetなどは使用できません。

そしてあなたの実装を使用できない理由についてのこの答え



ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ