Как мне сопоставить производное свойство с базовым классом, используя NHibernate? - PullRequest
1 голос
/ 15 ноября 2010

У меня проблемы с определенным отображением. Допустим, у меня есть три оценки, которые все выводятся из базы 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; }
    }
}

Другими словами, три типа оценки IndividualAssessment, BusinessAssessment и InfrastructureAssessment имеют определенную стоимость ущерба, но все они реализуют базовый класс 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, чтобы этот запрос возвращал правильный результат?

1 Ответ

1 голос
/ 16 ноября 2010

Одним из решений было бы сопоставить DamageCostTotal с базовым классом. Создайте столбец для DamageCostTotal в таблице, если его нет. NHibernate не нужно знать о формулах в этом сценарии, и это хорошо, так как классы уже выполняют тяжелую работу.

Ваш запрос должен привести к SQL, похожему на этот ...

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