2010-11-15 8 views
1

J'ai des problèmes avec un certain mapping. Disons que j'ai trois évaluations que tous dérivent de base Assessment:Comment mapper une propriété dérivée sur une classe de base à l'aide de 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; } 
    } 
} 

En d'autres termes, les trois types d'évaluation, IndividualAssessment, BusinessAssessment et InfrastructureAssessment, ont tous les coûts des dommages spécifiques, mais toutes mettent en œuvre la classe de base 'DamageTotalCost afin d'obtenir le coût total des dommages d'une évaluation.

Dans mes applications Fluent NHibernate, je cartographié chaque DamageCostTotal pour chaque évaluation spécifique:

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

Cela fonctionne très bien quand je fais une recherche sur les types spécifiques d'évaluation:

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

Mais lorsque je tente de interroger sur le type d'évaluation de base:

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

Il génère le mal SQL (nettoyé un peu pour faciliter la lecture):

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 

Comme vous pouvez le voir, cela crée correctement les formules, mais quand il fait le ORDER BY, il ne l'ordonne par les InfrastructureAssessment propriétés et non les formules. Est-ce que quelqu'un sait comment mapper la base DamageCostTotal afin que cette requête renvoie le résultat correct?

Répondre

1

Une solution consisterait à mapper DamageCostTotal dans la classe de base. Créez une colonne pour DamageCostTotal dans la table s'il n'y en a pas. NHibernate n'aura pas besoin de connaître les formules dans ce scénario, ce qui est bien puisque les classes font déjà le gros du travail.

Votre requête doit entraîner SQL similaire à ce ...

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

Merci, je l'ai essayé et il fonctionne très bien. –

Questions connexes