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' は、Entity Framework がコレクションの変更を追跡できるようにするために、ICollection< T> を実装する必要があります。」

私が得られないのは、「詳細」プロパティが ICollection< T> である ObservableCollection< T> を継承するカスタム型であるため、ICollection< T> を実装する必要があるという例外はなぜですか?

誰かがこれに光を当てているなら、私は感謝します、ありがとう。

4

1 に答える 1

0

EF チーム メンバーのこのブログ投稿で説明されているように

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

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

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

実装を使用できない理由については、この回答を参照してください。

于 2013-10-29T14:10:23.180 に答える