2009-02-26 17 views
0

Bitte helfen Sie mir - ich bin neu in NHibernate und ich kann nicht finden, was ich suche. Ich habe zwei Tabellen in einer Datenbank: Fund und FundBalance. A Fund kann viele FundBalances haben und eine FundBalance hat nur eine Fund. In C# gibt es nur die FundBalance Klasse. Spalten aus der Tabelle Fund, die mit Spalten aus der Tabelle FundBalance verknüpft sind, müssen den Eigenschaften der Klasse FundBalance zugeordnet werden.NHibernate Mapping nach einer Normalisierung

Zum Beispiel kann die Fund Tabelle enthält die FundName Eigenschaft und die FundBalance Tabelle enthält die AvailableBalance Eigenschaft. Diese beiden Tabellen werden verknüpft, und das Ergebnis der Verknüpfung muss den Eigenschaften FundName und AvailableBalance der Klasse FundBalance zugeordnet werden.

Die Frage: Wie mache ich das mit NHibernate? Bonus: Wie lege ich das Mapping mit FluentNHibernate fest?

Eine Lösung, an die ich dachte, war, eine Sicht in der Datenbank zu erstellen, aber ich würde es vorziehen, wenn die Zuordnung rein mit NHibernate erfolgen kann.

+0

Was ist in der FundBalance-Klasse aus Daten, die aus der FundBalance-Tabelle stammen, da ein Fonds mehrere FundBalances haben kann? Wie sieht dann Ihre FundBalance-Klasse aus und was genau geht da rein? –

Antwort

0

Aus welchem ​​Grund haben Sie keine Fund-Klasse? Ich würde überdenken, wenn das wirklich weise ist.

Aber wenn man auf dieser Strecke bleiben will, könnte das subselect Attribut helfen (sorry ich habe dies aus dem Hibernate docs nicht NHibernate, aber ich hoffe, sie sind ähnlich genug: http://www.hibernate.org/hib_docs/core/reference/en/html_single/#mapping-declaration-class)

ich das denken würde, sollte zum Auswählen, Aktualisieren und Löschen funktionieren. Aber ich habe keine Ahnung, wie Insert funktionieren sollte (unabhängig von Hibernate), wer sollte entscheiden, ob Sie einen neuen Fondsdatensatz benötigen oder einen (wenn?) Aktualisieren, wenn die Fund-Tabelle in Ihrem Objektmodell nicht korrekt dargestellt wird .

Eine Alternative wäre (wie Sie selbst erwähnt haben), eine Sicht in der Datenbank zu erstellen und "statt Trigger" zu verwenden, wenn Ihre Datenbank dies unterstützt.

+0

Danke Jens. Nur um eine Frage zu beantworten, die Sie in Ihrer Antwort gestellt haben - wir haben keine Fund-Klasse, weil wir unsere Entitäten mit einem Altsystem teilen. Ich werde nicht auf die Gründe eingehen, aber wir müssen die Entitäten teilen. – Trumpi

+0

Warum machen Sie Ihr System nicht dazu, separate Fonds und fundBalance-Klassen zu verwenden? Es scheint, als ob es das richtige Domänenmodell ist, und erstellen dann eine separate Schnittstelle zu einem Legacy-System. Auf diese Weise bleiben Sie später gesund, wenn Sie Ihr System um diese Klassen herum aufbauen. – zappan

0

Warum verwenden Sie das Fassadenmuster nicht, wenn Sie nur eine gemeinsame Klasse für beide Tabellen benötigen? Map Fund und FundBalance erstellen normalerweise eine (nicht zugeordnete) neue Klasse als Schnittstelle für beide Entitäten. Einfach und überhaupt keine "Magie" involviert.

-1

Dies sollte mit Hibernate-Unterstützung für die Vererbung erfolgen. Hibernate kann Familien verwandter Klassen auf verschiedene Arten modellieren, aber eine ist eine Tabelle für die Basisklasse und eine weitere für jede Unterklasse, die ihre zusätzlichen Eigenschaften enthält. Beim Laden werden alle Spalten automatisch in die designierte Unterklasse geladen - erstellen Sie also eine falsche Vererbungsstruktur mit genau der einen Klasse und es sollte genau so funktionieren, wie Sie es beschreiben.

+0

Das hat nichts mit Vererbung zu tun –

0

Wenn Sie nur den Fonds lesen, aber nicht schreiben müssen, können Sie eine Formel verwenden. Zum Beispiel:

diese Weise können Sie mit FundBalances als normal zu arbeiten in der Lage, aber nicht mit dem Haushalt

1

Sie brauchen nicht eine Ansicht zu verwenden, um Ihr Problem zu lösen. Sie müssen nur bei der Verknüpfung spezifisch sein, wenn Sie die Zuordnung in der FundBalance-Tabelle vornehmen. Wenn mein Verständnis gut ist, möchten Sie Ihre FundBalance-Klasse vervollständigen und einige Eigenschaften aus der Fondstabelle haben.

Versuchen Sie folgendes:

<class name="FundBalance" table="FundBalance" lazy="true"> 
     <id name="Id" column="FundBalanceId" unsaved-value="0"> 
      <generator class="native"/> 
     </id> 

     <property name="FundBalance" not-null="true" length="80"/> 

     <join table="Fund"> 
      <key column="FundId"/> 
      <property name="FundName"/> 
     </join> 
</class> 

Für Ihre FundBalance Entitätsklasse wird der Code sein:

public class FundBalance 
{ 
     private long _Id; 
     public virtual long Id 
     { 
      get { return _Id; } 
      set { _Id = value; } 
     } 

     private decimal _FundBalance; 
     public virtual decimal FundBalance 
     { 
      get { return _FundBalance; } 
      set { _FundBalance= value; } 
     } 

     private string _FundName; 
     public virtual string FundName 
     { 
      get { return _FundName; } 
      set { _FundName= value; } 
     } 
} 

Wenn Sie für die Probleme der Zuordnung mutiple Tabelle mehr Probe und Erklärung müssen für eine enties dies versuchen Links:

https://svn.sourceforge.net/svnroot/nhibernate/trunk/nhibernate/src/NHibernate.Test/Join/ http://ayende.com/Blog/archive/2007/04/24/Multi-Table-Entities-in-NHibernate.aspx

Ich gebe Ihnen die HBM gemappten Dateien, für fließende Nhibernate ich weiß nicht, ob Sie die Schlüsselwörter JOIN verwenden können, aber bassicly ist es das gleiche Problem.

Hoffe, das hilft.