2010-12-28 9 views
1

Ich fange an, NHibernate (3.0) zu lernen und nahm eine Kopie von Packt Publishing NHibernate 3.0 Cookbook.Ist mein NHibernate-Buch falsch?

Es gibt einen Abschnitt über One-to-Many-Mappings, durch den ich gehe, aber mit meiner eigenen Datenbank. Er schlägt vor, ich sollte etwas tun eine Eins-zu-Beziehung zwischen Kunden und ihre Domains zu modellieren:

public class Customer 
{ 
    public virtual int Id { get; protected set; } 
    public virtual string CustomerName { get; set; } 
    // Customer has many domains 
    public virtual IList<Domain> Domains { get; set; } 
} 

public class Domain 
{ 
    public virtual int Id { get; protected set; } 
    public virtual int CustomerID { get; set; } 
    public virtual string DomainName { get; set; } 
} 

Kunden Mapping:

<class name="Customer" table="tblCustomer"> 
    <id name="Id"> 
    <column name="CustomerID" sql-type="int" not-null="true"/> 
    <generator class="identity"/> 
    </id> 

    <property name="CustomerName" column="Customer"/> 
    <list name="Domains"> 
    <key column="CustomerID"/> 
    <one-to-many class="Domain" /> 
    </list> 
</class> 

Als ich das ich die folgende Fehlermeldung aus:

XML-Validierungsfehler: Das Element 'list' im Namespace 'urn: nhibernate-mapping-2.2' hat das ungültige untergeordnete Element 'eins-zu-viele' im Namespace 'urn: nhibernate-mapping-2.2'. Liste der möglichen erwarteten Elemente: 'index, list-index' im Namensraum 'urn: nhibernate-mapping-2.2'.

Das Beispiel Buch ist ein wenig komplexer, da sie verwenden Tabelle pro Unterklasse Zuordnungen:

alt text

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
    assembly="Eg.Core" 
    namespace="Eg.Core"> 
    <subclass name="Movie" extends="Product"> 
    <property name="Director" /> 
    <list name="Actors" cascade="all-delete-orphan"> 
     <key column="MovieId" /> 
     <index column="ActorIndex" /> 
     <one-to-many class="ActorRole"/> <-- Is this wrong? 
    </list> 
    </subclass> 
</hibernate-mapping> 

Ich vermute, das Buch ist falsch?

+0

Aus der Fehlermeldung könnte man leicht annehmen, dass 'eins-zu-viele' nie ein Kind sein kann, das' listen' ist. Ich würde das einen Fehler in der Fehlermeldung nennen. – Mitja

Antwort

4

Nein, in Ihrem Mapping fehlt das Element index. Eine Liste in NHibernate ist eine geordnete Menge. Wenn Sie eine ungeordnete Menge verwenden möchten, verwenden Sie die Beutelzuordnung.

+0

Danke .... Ich fühle mich heute richtig richtig noob. :) – Kev

+0

Die Listenzuordnung erfordert eine Spalte, die dem Listenindexwert zugeordnet ist. Bag oder Set wäre in Ihrem Fall besser geeignet. Ein Set erlaubt keine Duplikate und kann sortiert werden, während eine Tasche nur eine einfache Sammlung von Elementen ist. –

+0

@Dmitry - danke für den Rat. – Kev