2009-06-01 7 views
1

Ich habe zwei Tabellen Deal und Cost. Die Kosten können unterschiedlich sein, z. B. geplant, ungeplant. Jeder Deal kann einen einzigen von jeder Art von Kosten haben. Dies ist einfach genug, um als ein Many-to-One-Deal abzubilden und eine Kosten-Nutzen-Analyse durchzuführen. Aber was ich will, ist ein Kostenobjekt zu erstellen, das Eigenschaften für jede Kosten benannt hat. So dass für eine Datenbank, die wie folgt aussieht:Nhibernate Mapping: Einschließen einer Liste innerhalb eines Objekts

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

es wie diese

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

zugänglich ist, wie ist der beste Weg, um die Abbildung dies zu realisieren? Soll ich es sogar abbilden oder sollte ich einfach die Eigenschaften von Hand schreiben, um die zugrunde liegende Sammlung abzufragen?

Die Schwierigkeit, wie ich sehe, ist die Zuordnung der Eigenschaften von Kosten, so dass sie zu verschiedenen Zeilen in der gleichen Tabelle zuordnen. Verwenden einer der Spalten als Diskriminator.

Antwort

0

Schreiben Sie die Eigenschaften Methoden von Hand:

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

Dies ermöglicht meine Notierung von deal.costs.CostName. Das ist der problematische Teil des Mappings für mich. –

+0

Warum sind Sie an dieser Stelle besorgt über Ihre Notation? –

0

Das klingt für mich nicht wirklich wie Kosten ist eine Liste.

Ich würde die Kosten als eine Eigenschaft auf Deal zuordnen. Wenn Sie die Deal.Costs.Planned-Syntax beibehalten möchten, können Sie eine Komponentenzuordnung verwenden.

+0

Das macht Sinn. Aber wie kann ich die Komponentenzuordnung für jede Eigenschaft der Liste verschiedene Zeilen aus der Costs-Tabelle auswählen lassen, muss ich eine Art von Diskriminator einstellen, denke ich, aber ich habe das noch nie gesehen. –

+0

Wenn Sie eine Kosten als Eigenschaft eines Geschäfts zuordnen, müssen Sie der Geschäftstabelle einen Fremdschlüssel hinzufügen. Ich nehme natürlich an, Sie haben die Kontrolle über die db. –

+0

Die DB hat diese Struktur bereits. Die Schwierigkeit besteht darin, die Eigenschaften verschiedenen Zeilen derselben Tabelle zuzuordnen. Die Frage wurde bearbeitet, um dies deutlicher zu machen. –

0

I Kosten als Privatsammlung Karte würde und geplante und ungeplante Kosten auf Deal aus. Dies würde es Ihnen ermöglichen, "Jede Transaktion kann nur eine von jeder Art von Kosten haben" als Geschäftsregel durchzusetzen. Es würde wie folgt aussehen:

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

Sie können Formel-Eigenschaften in der Klasse mit Formel-Tag von NHibernate mapping.A Formel ist einfach eine SQL-Anweisung, die als Unterabfrage in einer Mapping-Abfrage eingefügt wird. Offensichtlich Formeleigenschaften sind schreibgeschützt und können nicht aktualisiert werden.

Da Sie diese Eigenschaften für jeden Deal berechnen möchten Sie sie als Deal Eigenschaften hinzufügen sollten (wenn Sie Formel verwenden möchten) so haben Sie:

Deal.UnPlannedCosts 
Deal.PlannedCosts 

Here ‚einen Artikel s, der erklärt, Formeleigenschaften.

Verwandte Themen