0

このようなデータ モデル ( http://alanstorm.com/2009/img/magento-book/eav.png ) では、Linq to SQL を使用して EAV_Attribute から値を取得したいと考えています。

ここに画像の説明を入力

EAV_Attribute が 1 つの継承されたテーブル (varchar、decimal、int など) にのみ存在すると仮定すると、どうすればそれを linq クエリで取得できますか?

これには継承を使用できることはわかっていますが、SQL データベース側で実行したい...

要素のタイプが異なることを考えると、Linq で一種の合体を行うことは可能ですか?

4

2 に答える 2

0

まず、EAV テーブルには TPT ではなく TPH を使用することをお勧めします。(複数の null 値列を持つ 1 つのテーブル (型ごとに 1 つ) + 識別子と型ごとに 1 つのテーブル。)

どちらの方法でも、値プロパティを追加する値データ型ごとに継承エンティティを持つ抽象クラス (2 つの ID を含む) として値エンティティをモデル化した場合、LINQ は次のようになります。

var valueEntity = context.ProductAttributes.Where(pa =>
        pa.ProductId == selectedProductId
        && pa.AttributeTypeId == selectedAttributeTypeId)
    .SingleOrDefault() as ProductAttributeOfDouble;

if valueEntity != null
    return valueEntity.Value;

return null;

エンティティ タイプは、Product、AttributeType、ProductAttribute、ProductAttributeOfDouble、... ProductAttributeOfString です。

于 2012-12-05T22:24:39.170 に答える
0

EAV と linq は幸せな結婚ではありません。あなたのベストショットは、型指定された属性の子からeav_attribute値を(として)解決するマップされていないプロパティを作成することだと思います。objectエンティティ フレームワークでは、このプロパティを式で使用することはできません (つまり、Whereまたはでは使用できません) 。アクセスするには、まず にSelect変換する必要があります。IEnumerable(Linq-to-sql は、ボンネットの下で linq-to-objects に切り替えることができるため、それを許可する場合があります)。

別のオプションは、同じことを行うタイプの計算列を作成することですsql_variantが、現在は t-sql コードです。しかし... EFはサポートしていませんsql_variant。読むにはちょっとした工夫が必要です

それが読書の部分です。

値を設定/変更/削除するためのショートカットが表示されません。親と子を持つ任意のオブジェクト グラフとしてオブジェクトを処理するだけです。SQL Server では、1 つの外部キーに対してしか定義できないため、カスケード削除を使用できません。(これはそれに取り組むかもしれませんが、試したことはありません)。

ですから、本当に良いニュースではありません。あるプロジェクトでは、避けられない EAV 部分を持つデータベースも扱っていることを知っておくとよいでしょう。EF でも行いますが、摩擦がないわけではありません。

于 2012-12-05T22:03:32.003 に答える