【问题标题】:How do I map a derived property on a base class using NHibernate?如何使用 NHibernate 在基类上映射派生属性?
【发布时间】:2010-11-15 20:34:42
【问题描述】:

我在处理某个映射时遇到了问题。假设我有三个评估都来自基础Assessment

public abstract class Assessment
{
    public abstract int DamageCostTotal { get; set; }
}

public class IndividualAssessment
{
    public virtual int DamageCostHouse { get; set; }
    public virtual int DamageCostCar { get; set; }
    public virtual int DamageCostBelongings { get; set; }
    public override DamageCostTotal
    {
        get { return DamageCostHouse + DamageCostCar + DamageCostBelongings; }
    }
}

public class BusinessAssessment
{
    public virtual int DamageCostBuilding { get; set; }
    public virtual int DamageCostGoods { get; set; }
    public virtual int DamageCostOther { get; set; }
    public override DamageCostTotal
    {
        get { return DamageCostBuilding + DamageCostGoods + DamageCostOther; }
    }
}

public class InfrastructureAssessment
{
    public virtual int DamageCostStructure { get; set; }
    public virtual int DamageCostEstimatedRepair { get; set; }
    public override DamageCostTotal
    {
        get { return DamageCostStructure + DamageCostEstimatedRepair; }
    }
}

也就是说,IndividualAssessmentBusinessAssessmentInfrastructureAssessment这三种评估类型都有特定的伤害消耗,但它们都实现了基类'DamageTotalCost以获得一个评估的总伤害成本。

在我的 Fluent NHibernate 映射中,我为每个特定评估映射了每个 DamageCostTotal:

// individual assessment
Map(x => x.DamageCostTotal)
    .Access.Readonly()
    .Formula("DamageCostHouse + DamageCostCar + DamageCostBelongings");
// the other two are mapped the same way, just with a different formula

当我查询特定的评估类型时,这非常有用:

Session.Query<IndividualAssessment>().OrderBy(x => x.DamageCostTotal);
Session.Query<BusinessAssessment>().OrderBy(x => x.DamageCostTotal);
Session.Query<InfrastructureAssessment>().OrderBy(x => x.DamageCostTotal);

但是当我尝试查询基础评估类型时:

Session.Query<Assessment>().OrderBy(x => x.DamageCostTotal);

它生成了错误的 SQL(为了便于阅读,稍微清理了一下):

SELECT ...
    DamageCostHouse + DamageCostCar + DamageCostBelongings as formula0_0_,
    DamageCostBuilding + DamageCostGoods + DamageCostOther as formula1_0_,
    DamageCostStructure + DamageCostEstimatedRepair as formula2_0_,
    FROM [Assessment] this_
    ORDER BY DamageCostStructure + DamageCostEstimatedRepair

如您所见,它正确地创建了公式,但是当它执行ORDER BY 时,它仅按InfrastructureAssessment 属性而不是公式对其进行排序。有谁知道如何映射基础DamageCostTotal 以便此查询返回正确的结果?

【问题讨论】:

    标签: c# sql nhibernate fluent-nhibernate nhibernate-mapping


    【解决方案1】:

    一种解决方案是在基类中映射 DamageCostTotal。如果没有,请在表中为 DamageCostTotal 创建一列。 NHibernate 在这种情况下不需要知道公式,这很好,因为这些类已经在做繁重的工作了。

    您的查询应该产生与此类似的 SQL...

    SELECT ..., this_.DamageCostTotal FROM Assessment this_ ORDER BY this_.DamageCostTotal
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多