0

現在、既存の.NET 4.0 MVC 3 Webアプリケーションのデータアクセスレイヤーをエンティティフレームワークに移植する方法を研究しています。多くの理由がありますが、主なものは何千ものストアドプロシージャによるもので、1つのフィールドをテーブルに追加すると、結果は30〜50になります。Fluent NHibernateの複数フィールドへの発行

私たちはMS SQL Server 2008 R2を使用しており、理想的にはNHibernateとFluentをマッピングに使用したいと考えています。

私はイムは、簡単な例の中にある問題を単純化している: '製品名' テーブルを

'商品' 表

ID (INT) 
DefaultName (NVARCHAR(128)) 

は、以下の2つのテーブルを想像してみて

ProductID (INT) 
Name (NVARCHAR(128)) 
Culture (VARCHAR(10)) 

Productsテーブルには製品のリストが含まれ、それぞれにデフォルトの英語名が付けられます。製品名テーブルには、製品の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); 
    }); 
    } 
} 

しかし、これは、次の例外をもたらす:製品109は、このようにすべての5本の翻訳を有しているため

More than one row with the given identifier was found: 109, for class: Product 

であります単一の文字列にマップすることはできません。

私は 'HasMany <>'メソッドを使用してすべての翻訳を製品内のリストにマップすることができました。しかし、これは私が必要なものではありません。

答えて

1

名は読み取り専用その後、迅速な応答フリオのため

public class ProductMap : ClassMap<Product> { 
    public ProductMap() { 
     Id(p => p.Id); 

     Map(p => p.Name).Formula("Select ISNULL(pn.Name, DefaultName) FROM ProductNames pn WHERE pn.ProductID = ID AND pn.Culture = '" + GetCUltureFromSomewhere() + "'"); 
    } 
} 
+0

おかげであれば!これは今のところうまくいくので、私は答えを受け入れました!しかし、(ここで私のNHibernateの経験が不十分であることを許してください)、私はこのことがデータベースに2回ぶつかると言うのは間違いありません。私がJoinがここより良くなると思ったのは、2よりもちょうど1ヒットだったからでしょうか? – Needles

+0

あなたはログオンして試してみるべきです。 IMOそれは1ヒットでそれを行います – Firo

+1

フィロ、あなたは正しいです!あなたの素早い対応のためにもう一度ありがとう! – Needles