0

次のシナリオを考えてみましょう: 私のプロジェクトには、Poco オブジェクト Animal を使用したコード ファースト モデルがあります。動物の行には 50 個のプロパティがあり、アプリケーションにはそのうちの 5 個だけが必要です。そこで、この 5 つのプロパティを Poco オブジェクトに射影してみます。

List<Animal> animals = (from an in dbContext.Animal 
                        where an.IsMammal
                        select new Animal { Id = an.Id , Color = an.Color , Height = an.Height, Width = an.Width , Hair = an.Hair }).ToList();

Animal は StrongTyped オブジェクトであり、SQL に変換できません。

一方、新しい Poco を宣言すると、Animal とまったく同じように AnimalDTO と言う

List<AnimalDTO> animals = (from an in dbContext.Animal 
                        where an.IsMammal
                        select new AnimalDTO { Id = an.Id , Color = an.Color , Height = an.Height, Width = an.Width , Hair = an.Hair }).ToList();

これは、Entity Framework に関する限り、Animal がマップされたクラスであるために発生することを理解しています。私が理解したいのは、1つのケースを有効なオプションにし、2番目のケースを無効にする内部の仕組みです。.Net が Poco オブジェクトの使用を本質的に許可しないのはなぜですか? それには理由がありますか、それとも単に機能が不足しているだけですか? 何百もの本質的に同一の dto を作成することを回避できるように、最初のステートメントを使用する回避策はありますか?

4

1 に答える 1

1

このEFの制限が説明されているリンクが見つかりません。現在の EF (6) のソースもあまりコミュニケーションがとれていません。例外がスローされた場合、それは言うだけです

// 名義型はサポートされていません

そこで、しばらく考えてみました。

肝心なのは、あなたはそれを本当にめちゃくちゃにすることができるということだと思います。より正式には、EF が有効な状態であると見なさないエンティティ オブジェクトを作成できます。プロパティAnimalへの参照があったZooとしZooIdます。動物園 A を参照に入れ、動物園 B の id 値を Id に入れることができます。

次に、エンティティを追跡するポイントがあります。あなたがするとき

dbContext.Animal.ToList()

オブジェクトはAnimalEF 自体によって実体化されます。これらは、コンテキストのキャッシュと変更トラッカーに追加されます。エンティティ オブジェクトに直接射影できたとしても、それらが追跡されないことは明らかではありません。

すべての母親に同じ色を与えるとします。次のようにするのは明白に見えるかもしれません:

    var animals = (from an in dbContext.Animal 
        where an.IsMammal
        select new Animal { Id = an.Id , Color = myColorVariable, .... });
    dbContext.SaveChanges();

しかし、あなたはできません。EF は、有効な状態にあることを信頼できるように、自身が実体化したエンティティのみを追跡したいと考えています。

.AsEnumerable()ちなみに、投影する直前に入れると思い通りにできます。AsEnumerableEFが制御不能になった後。同様に、EF によって実体化された有効なオブジェクトを取得し、それに一致しないオブジェクトAnimalを割り当てることができます。問題は、変更を保存しようとするときなど、EF が再び制御を取得したときに発生します。ZooZooId

于 2013-05-03T12:39:05.843 に答える