2009-06-01 7 views
1

J'ai deux tables Deal et Cost. Les coûts peuvent être de plusieurs types, p. Ex. Planifiés, non planifiés. Chaque transaction peut avoir un seul de chaque type de coût. Ceci est assez facile à cartographier comme un multi-à-un sur le marché, en train de faire une liste des coûts. Mais ce que je veux, c'est créer un objet de coûts qui a nommé des propriétés pour chaque coût. Alors que, pour une base de données qui ressemble à ceci:Nhibernate mapping: Encapsulation d'une liste dans un objet

Deal:    Cost 
ID Name   ID DealID Type  Value 
---------   ------------------------------- 
1 Test   1 1  Planned  10 
        2 1  Unplanned 5 

est accessible comme celui-ci

Deal.Costs.Planned = 10m; 
Deal.Costs.Unplanned = 5m; 

Comment est la meilleure façon d'aller sur le mappage cela? Dois-je même le mapper ou dois-je simplement écrire les propriétés à la main pour interroger la collection sous-jacente? La difficulté que je vois est de cartographier les propriétés du coût de sorte qu'ils correspondent à des lignes différentes dans la même table. Utiliser l'une des colonnes comme discriminateur.

Répondre

0

Ecrire les propriétés méthodes à la main:

public class Deal 
{ 
    public virtual Cost GetPlannedCost() 
    { 
     return _costs.FirstOrDefault(x => x.IsPlanned()); 
    } 

    public virtual Cost GetUnplannedCost() {} 
    { 
     return _costs.FirstOrDefault(x => x.IsUnplanned()); 
    } 

    public virtual Cost[] GetAllCosts() 
    { 
     return _costs.ToArray(); 
    } 

    private ISet<Cost> _costs = new HashedSet<Cost>(); 
} 
+0

Ce doenst permet ma notation de deal.costs.CostName. C'est la partie problématique de la cartographie pour moi. –

+0

Pourquoi êtes-vous préoccupé par votre notation à ce stade? –

0

Cela ne me semble pas vraiment Coûts est une liste.

Je voudrais mapper le coût en tant que propriété sur Deal. Si vous souhaitez conserver la syntaxe Deal.Costs.Planned, vous pouvez utiliser un mappage de composants.

+0

Cela a du sens. Mais comment puis-je avoir le mappage des composants sélectionner des lignes différentes de la table des coûts pour chaque propriété de la liste, je dois définir une sorte de discriminateur je suppose, mais je n'ai jamais vu cela fait. –

+0

Si vous mappez un coût en tant que propriété de transaction, vous devrez ajouter une clé étrangère à la table de transactions. Je suppose que vous avez bien sûr le contrôle de la DB. –

+0

La base de données a déjà cette structure. La difficulté consiste à mapper les propriétés sur différentes lignes de la même table. La question a été modifiée pour être plus claire à ce sujet. –

0

Je tracerait les coûts en tant que collection privée et exposerait prévues et les coûts non planifiés sur Deal. Cela vous permettrait d'appliquer "Chaque transaction peut avoir un seul de chaque type de coût" comme une règle métier. Il ressemblerait à quelque chose comme ceci:

public class Deal 
{ 
    private IList<Cost> _costs = new List<Cost>(2); // map this collection 

    public Cost PlannedCost 
    { 
     get { return _costs.FirstOrDefault(c => c.Type == CostType.Planned); } 
     set 
     { 
      var plannedCost = _costs.FirstOrDefault(c => c.Type == CostType.Planned); 
      if (plannedCost != null) 
      { 
       _costs.Remove(plannedCost); 
      } 
      _costs.Add(value); 
     } 
    } 

    public Cost UnplannedCost { // similarly } 
} 
0

Vous pouvez avoir des propriétés de formule dans votre classe en utilisant tag formule de formule NHibernate mapping.A est simplement une instruction SQL qui sera inséré en tant que sous-requête dans une requête de cartographie. Il est évident que les propriétés de formule sont en lecture seule et ne peuvent pas être mises à jour.

Puisque vous voulez calculer ces propriétés pour chaque transaction, vous devez les ajouter en tant que propriétés Deal (si vous souhaitez utiliser la formule) ainsi vous aurez:

Deal.UnPlannedCosts 
Deal.PlannedCosts 

Here d » un article qui explique propriétés de formule.