10

Publication から継承する Image というエンティティ タイプがあります (Publication には他に 5 つのタイプがあり、すべてが 10 の共通プロパティを共有しています)。

残念ながら、私の DB の画像テーブルには、異なる解像度の画像の 4 つのバージョンのデータを含む 4 つのバイナリ列が含まれているため、EF 画像タイプには次の 4 つのプロパティがあります: BinOriginal、BinHiRes、BinLowRes、BinThumbnail。データ。

これはパフォーマンスに影響を与えています。たとえば、一連の画像リンクを生成しているだけのときに、すべてのバイナリ データを取得したくありません。

そこで、4 つのバイナリ フィールドを新しい ImageFile エンティティに配置して、テーブル分割を試みました。複数のエンティティ タイプから同じテーブルへ.aspx

テーブル マッピングが正しいことを確認し、1 対 1 の関連付けを追加し、参照制約を含めましたが、次のエラーが発生します。

Error 3033: Problem in mapping fragments starting at line 2731:EntitySets 
'ImageFiles' and 'Publications' are both mapped to table 'Images'. Their primary 
keys may collide.

…分割するテーブルが継承関係にあることに問題があるようです。

Publication から新しい ImageFile EF タイプを継承しようとしましたが、エラーが発生しました。

Problem in mapping fragments starting at lines 2332, 2374:Two entities with 
different keys are mapped to the same row

質問これを回避する方法はありますか、それとも Image EF 型を Publication から継承する必要があるという事実は、他のフィールドを新しい型に分割することを妨げますか?

4

1 に答える 1

1

これは Entity Framework の制限と考えることができます。実際には、基になるデータベース アイテムのモデルと、モデルから構築されるエンティティの 2 つの部分があります。エンティティのサブクラスは、モデルにはまったく影響しません。

モデル行のすべてのデータをロードしたくない場合は、次のように射影します。

var results = from product in myDB.Products
              where product.Id == productId
              select New 
              {
                  Id = product.Id, 
                  Name = product.Name, 
                  ImageUrl = product.ImageUrl
              };

Entity Framework が作成する SQL クエリselectは、LINQ クエリの句で列のみを選択します。

これにより、Entity Framework がテーブル行をObjectContext(またはDBContextEF 5 の) オブジェクトに格納することもできなくなります。

余談ですが、個人的には、大規模なバイナリ データを NoSQL ソリューションに保存し、関連付けられたキーを自分で SQL データベースに保持したいと思います。

于 2012-12-10T11:10:41.413 に答える