2010-11-15 69 views
1

我遇到了一定的映射问题。比方说,我有三个评估,所有获得过一个基地Assessment如何使用NHibernate将派生属性映射到基类上?

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为了得到一个评估的总伤害成本。

在我流利的NHibernate映射,我映射到各DamageCostTotal对于每个具体的评估:

Session.Query<IndividualAssessment>().OrderBy(x => x.DamageCostTotal); 
Session.Query<BusinessAssessment>().OrderBy(x => x.DamageCostTotal); 
Session.Query<InfrastructureAssessment>().OrderBy(x => x.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<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 

正如你所看到的,它是正确创建的公式,但是当它被InfrastructureAssessment性质,而不是公式做了ORDER BY,它只有单吧。有谁知道如何映射基地DamageCostTotal,以便这个查询将返回正确的结果?

回答

1

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

您的查询应导致SQL与此类似...

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

谢谢,我试了一下,它的伟大工程。 – 2010-11-16 04:27:25

相关问题