Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用NHibernate在基类上映射派生属性?_C#_Sql_Nhibernate_Fluent Nhibernate_Nhibernate Mapping - Fatal编程技术网

C# 如何使用NHibernate在基类上映射派生属性?

C# 如何使用NHibernate在基类上映射派生属性?,c#,sql,nhibernate,fluent-nhibernate,nhibernate-mapping,C#,Sql,Nhibernate,Fluent Nhibernate,Nhibernate Mapping,我对某个映射有问题。假设我有三个评估,它们都是从一个基本的评估中衍生出来的: public abstract class Assessment { public abstract int DamageCostTotal { get; set; } } public class IndividualAssessment { public virtual int DamageCostHouse { get; set; } public virtual int DamageC

我对某个映射有问题。假设我有三个评估,它们都是从一个基本的
评估中衍生出来的:

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; }
    }
}
换句话说,三种评估类型,
IndividualAssessment
BusinessAssessment
Infrastructure assessment
,都有特定的损害成本,但它们都实现了基类“
DamageTotalCost
,以获得一项评估的总损害成本

在我的Fluent NHibernate映射中,我映射了每个特定评估的每个损伤成本总额:

// 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);

正如您所看到的,它正确地创建了公式,但当它按
进行排序时,它只按InfrastructureAssessment属性进行排序,而不按公式进行排序。有人知道如何映射基本的
DamageCostTotal
,以便此查询返回正确的结果吗?

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

您的查询应生成与此类似的SQL

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

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

您的查询应生成与此类似的SQL

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