0

次のような Products、Languages、および ProductTranslations という 3 つのテーブルがあるとします。

(1) ProductId
(1) StandardName
(1) 価格

(2) LanguageId
(2) LanguageName

(3) ProductTranslationId
(3) ProductId
(3) LanguageId
(3) LocalName
(3) LocalDescription

私のオブジェクト モデルでは、以下を含む単一のオブジェクト (単一のクラス マップ) が必要です。

(3) ProductTranslationId
(2) 言語
(3) LocalName
(3) LocalDescription
(1) 価格

このオブジェクトは表示のみに使用されるため、読み取り専用 (不変) で問題ありません。

ProductTranslationId は行を一意に識別します。

必要に応じて、このオブジェクトには LanguageID と ProductID の値も含めることができます。重要な機能は、この 1 対多の関係の 1 つの側から言語と価格の値を含める必要があることです。

多対一を使用して 3 つの個別のクラスでこれを行う方法を確認できますが、ProductTranslationId が <id> 値である 1 つのクラスでこれを行うにはどうすればよいですか?

データベースにビューを作成する必要のない代替手段はありますか?

4

2 に答える 2

2

オプション1

// FluentNHibernate Mapping
public class ProductTranslationDtoMap : ClassMap<ProductTranslationDto>
{
    public ProductTranslationDtoMap()
    {
        ReadOnly();
        Table(" ProductTranslation");
        Id(x => x.Id, "ProductTranslationId");

        Map(x => x.Language).Formula("(SELECT l.LanguageName FROM Language l WHERE l.LanguageId = LanguageId)");  // simple and highly portable sql formula
        Map(x => x.LocalName);
        Map(x => x.LocalDescription);
        Map(x => x.Price).Formula("(SELECT p.Price FROM Products p WHERE p.ProductId =  ProductId)");
    }
}

オプション 2

Product prod = null;
Language lang = null;
TranslationDto alias = null;
var results = session.QueryOver<ProductTranslation>()
    .JoinAlias(pt => pt.Language, () => lang)
    .JoinAlias(pt => pt.Product, () => prod)
    .SelectList(list => list
        .Select(pt => pt.Id).WithAlias(() => alias.ProductTranslationId)
        .Select(() => lang.Name).WithAlias(() => alias.Language)
        ...)
    .TransformUsing(Transformers.AliasToBean<TranslationDto>())
    .List<TranslationDto>();
于 2012-09-19T10:14:22.437 に答える
1

NHibernate マッピングを使用する代わりに、AutoMapper などのクラス マッパーを使用して、複雑なオブジェクト グラフのフラットな表現を作成することもできます。db スキーマが変更された場合に備えて、nhibernate マッピングを 1 つ維持することが少なくて済むという利点があります (ただし、Firo の流暢なバリアントはコンパイラの構文チェックを提供します)。もちろん、不利な点は速度です。最初に nhibernate に複雑なオブジェクト グラフを作成させ、次にそのグラフをフラット オブジェクトに変換する必要があるためです。この 1 つのフラット オブジェクトのみが必要な場合は、単一の NH マッピングを使用する方がよい場合があります。さらにいくつかのビューを作成することを検討している場合は、クラス マッパーを検討する価値があるかもしれません。

于 2012-09-19T10:29:51.053 に答える