現在、既存の .NET 4.0 MVC 3 Web アプリケーションのデータ アクセス レイヤーをエンティティ フレームワークに移植する方法を研究しています。多くの理由がありますが、主な理由は何千ものストアド プロシージャによるもので、テーブルに 1 つのフィールドを追加するだけで 30 ~ 50 の sproc 編集が発生します!!
MS SQL Server 2008 R2 を使用しており、マッピングには NHibernate と Fluent を使用したいと考えています。
私が抱えている問題を簡単な例に単純化しました。
次の 2 つのテーブルを想像してください。
「製品」テーブル
ID (INT)
DefaultName (NVARCHAR(128))
「製品名」表
ProductID (INT)
Name (NVARCHAR(128))
Culture (VARCHAR(10))
Products テーブルには製品のリストが含まれ、それぞれにデフォルトの英語の名前が付けられます。Product Names テーブルには、製品の ID と多くの翻訳が含まれます。
現在、ストアド プロシージャを使用すると、次のようになります。
SELECT Products.ID,
ISNULL(ProductNames.Name, Products.DefaultName) AS Name
FROM Products
LEFT JOIN ProductNames ON ProductNames.ProductID = Products.ID AND ProductNames.Culture = @Culture;
注: @Culture はプロシージャに渡されます
これにより、ローカライズされた名前またはデフォルト (英語) の名前を持つ単一の製品が常に返されます。
私の質問は: Fluent NHibernate のマッピング レベルでこれを行うことは可能ですか? 「2列に参加する方法」について何日も検索してきましたが、うまくいく解決策が見つかりません。このような成熟したフレームワークでこれが不可能な場合、奇妙に思えますか?
私が実験してきたことの例として:
public class ProductMap : ClassMap<Product> {
public ProductMap() {
Id(p => p.Id);
Join("ProductNames", pn => {
pn.Optional()
.KeyColumn("ProductID")
.Map(p => p.Name);
});
}
}
ただし、これにより次の例外が発生します。
More than one row with the given identifier was found: 109, for class: Product
これは、製品 109 に 5 つの翻訳があり、5 つすべてを 1 つの文字列にマッピングできないためです。
「HasMany<>」メソッドを使用して、すべての翻訳を製品内のリストにマップすることができました。しかし、これは私が必要とするものではありません。