0

假设我有三个表 Products、Languages 和 ProductTranslations,如下所示:

(1) 产品 ID
(1) 标准名称
(1) 价格

(2) 语言标识
(2) 语言名称

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

在我的对象模型中,我需要一个包含以下内容的对象(单个类映射)

(3) ProductTranslationId
(2) 语言
(3) LocalName
(3) LocalDescription
(1) 价格

该对象仅用于显示,所以只读(不可变)就可以了。

ProductTranslationId 唯一标识一行。

如有必要,此对象还可以包含 LanguageID 和 ProductID 值。重要的特征是,这需要包含来自该一对多关系的 ONE 一侧的 Language 和 Price 值。

我可以看到如何使用多对一在 3 个单独的类中执行此操作,但是如何使用一个类执行此操作,其中 ProductTranslationId 是 <id> 值?

是否有不需要在数据库中创建视图的替代方法?

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 这样的类映射器来创建复杂对象图的平面表示。如果您的数据库架构发生更改,其优点是可以减少维护一个休眠映射(尽管 Firo 的流利变体提供编译器语法检查)。缺点当然是速度,因为您首先必须让 nhibernate 创建复杂的对象图,然后将该图转换为平面对象。如果您只需要这个平面对象,则最好使用单个 NH 映射。如果您考虑创建更多视图,类映射器可能值得一看。

于 2012-09-19T10:29:51.053 回答