2009-07-29 10 views
0

Ich habe eine Datenbank mit einer 6-Level-Hierarchie und einem Domain-Modell darüber. etwas wie folgt aus:Nhibernate Multilevel-Hierarchie Fehler speichern?

Kategorie -SubCategory -Container -DataDescription | Meta-Daten -Daten

Die Abbildung ich benutze folgt dem folgenden Muster:

<class name="Category, Sample" table="Categories"> 
    <id name="Id" column="Id" type="System.Int32" unsaved-value="0"> 
     <generator class="native"/> 
    </id>  
    <property name="Name" access="property" type="String" column="Name"/> 
    <property name="Metadata" access="property" type="String" column="Metadata"/> 
    <bag name="SubCategories" 
     cascade="save-update" 
     lazy="true" 
     inverse="true"> 
     <key column="Id" foreign-key="category_subCategory_fk"/> 
     <one-to-many class="SubCategory, Sample" /> 
    </bag> 
    </class> 

<class name="SubCategory, Sample" table="SubCategories"> 
    <id name="Id" column="Id" type="System.Int32" unsaved-value="0"> 
     <generator class="native"/> 
    </id> 
    <many-to-one name="Category" 
       class="Category, Sample" 
       foreign-key="subCat_category_fk"/> 

    <property name="Name" access="property" type="String"/> 
    <property name="Metadata" access="property" type="String"/> 

    <bag name="Containers" 
     inverse="true" 
     cascade="save-update" 
     lazy="true"> 
     <key column="Id" foreign-key="subCat_container_fk" /> 
     <one-to-many class="Container, Sample" /> 
    </bag> 
</class> 

<class name="Container, Sample" table="Containers"> 
    <id name="Id" column="Id" type="System.Int32" unsaved-value="0"> 
     <generator class="assigned"/> 
    </id> 
    <many-to-one name="SubCategory" 
       class="SubCategory,Sample"     
       foreign-key="container_subCat_fk"/>  

    <property name="Name" access="property" type="String" column="Name"/> 

    <bag name="DataDescription" cascade="all" lazy="true" inverse="true"> 
     <key column="Id" foreign-key="container_ DataDescription_fk"/> 
     <one-to-many class="DataDescription, Sample" /> 
    </bag> 

    <bag name="MetaData" cascade="all" lazy="true" inverse="true"> 
     <key column="Id" foreign-key="container_metadata_cat_fk"/> 
     <one-to-many class="MetaData, Sample" /> 
    </bag> 
</class> 

Aus irgendeinem Grund, wenn ich versuche, die Kategorie zu speichern (mit der Unterkategorie, Container usw. angebracht) bekomme ich ein Fremdschlüsselverletzung von der Datenbank.

Der Code ist so etwas (Pseudo). Hier

var category = new Category(); 
var subCategory = new SubCategory(); 
var container = new Container(); 
var dataDescription = new DataDescription(); 
var metaData = new MetaData(); 

category.AddSubCategory(subCategory); 
subCategory.AddContainer(container); 
container.AddDataDescription(dataDescription); 
container.AddMetaData(metaData); 

Session.Save(category); 

ist das Protokoll aus diesem Test:

DEBUG NHibernate.SQL - INSERT INTO Categories (Name, Metadata) VALUES (@p0, @p1); select SCOPE_IDENTITY(); @p0 = 'Unit test', @p1 = 'unit test' 

DEBUG NHibernate.SQL - INSERT INTO SubCategories (Category, Name, Metadata) VALUES (@p0, @p1, @p2); select SCOPE_IDENTITY(); @p0 = '1', @p1 = 'Unit test', @p2 = 'unit test' 

DEBUG NHibernate.SQL - INSERT INTO Containers (SubCategory, Name, Frequency, Scale, Measurement, Currency, Metadata, Id) VALUES (@p0, @p1, @p2, @p3, @p4, @p5, @p6, @p7); @p0 = '1', @p1 = 'Unit test', @p2 = '15', @p3 = '1', @p4 = '1', @p5 = '1', @p6 = 'unit test', @p7 = '0' 

ERROR NHibernate.Util.ADOExceptionReporter - The INSERT statement conflicted with the FOREIGN KEY constraint "subCat_container_fk". The conflict occurred in database "Sample", table "dbo.SubCategories", column 'Id'. 

Die Methoden für Objekte Hinzufügen von Objekten immer wie folgt:

public void AddSubCategory(ISubCategory subCategory) 
{ 
    subCategory.Category = this; 
    SubCategories.Add(subCategory); 
} 

Was bin ich fehlt ??

Danke, nisbus

+0

Danke Mann, Sie meinen Tag, habe ich beginne meinen Kopf über denselben Fehler verschrotten .. – Agasani

Antwort

0

Nun fand ich den Fehler.

Ich musste die Spalten in den Zuordnungen eins zu viele und viele zu eins etwas anderes als ID nennen, damit dies richtig funktioniert.

Die richtige Zuordnung würde wie folgt aussehen:

<class name="Category, Sample" table="Categories"> 
    <id name="Id" column="Id" type="System.Int32" unsaved-value="0"> 
     <generator class="native"/> 
    </id>  
    <property name="Name" access="property" type="String" column="Name"/> 
    <property name="Metadata" access="property" type="String" column="Metadata"/> 
    <bag name="SubCategories" 
     cascade="save-update" 
     lazy="true" 
     inverse="true"> 
     <key column="Category_Id" foreign-key="category_subCategory_fk"/> 
     <one-to-many class="SubCategory, Sample" /> 
    </bag> 
    </class> 

<class name="SubCategory, Sample" table="SubCategories"> 
     <id name="Id" column="Id" type="System.Int32" unsaved-value="0"> 
       <generator class="native"/> 
     </id> 
     <many-to-one name="Category" 
           class="Category, Sample" 
           column="Category_Id" 
           foreign-key="subCat_category_fk"/> 

     <property name="Name" access="property" type="String"/> 
     <property name="Metadata" access="property" type="String"/> 

     <bag name="Containers" 
       inverse="true" 
       cascade="save-update" 
       lazy="true"> 
       <key column="Container_Id" foreign-key="subCat_container_fk" /> 
       <one-to-many class="Container, Sample" /> 
     </bag> 
</class> 

Alles funktioniert jetzt groß.

Danke, nisbus

Verwandte Themen