2009-05-03 7 views
5

Ho una relazione uno a uno tra una classe aziendale e una classe CompanySettings. Quando creo un nuovo oggetto di società, (un oggetto CompanySettings si crea nel costruttore della Società per le sue proprietà Impostazioni), e poiNHibernate, mappatura uno-a-uno, inserto a cascata

SaveOrUpdate(session, companyObject) 

mi aspetto l'inserto a cascata dalla Società alle CompanySettings. Tuttavia, ciò non accade a meno che non chiami anche SaveOrUpdate sull'oggetto CompanySettings.

file di mapping di seguito riportate:

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"`> 
    <class name="AST.Domain.Company, AST.Domain" table="Companies"> 
    <id name="EntityID" column="CompanyId"> 
     <generator class="guid.comb" /> 
    </id> 
    <property name="CompanyName" /> 
    . . . 
    <one-to-one name="Settings" class="AST.Domain.CompanySettings, AST.Domain" 
       constrained="true" lazy="false" /> 
    </class> 
</hibernate-mapping> 

mio file di mapping per la classe delle impostazioni aziendali:

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> 
    <class name="AST.Domain.CompanySettings, AST.Domain" table="CompanySettings"> 
    <id name="EntityID" column="CompanyId"> 
     <generator class="foreign"> 
     <param name="property">Company</param> 
     </generator> 
    </id> 
    <property name="MaxUsers" /> 
    <one-to-one name="Company" class="AST.Domain.Company, AST.Domain" /> 
    </class> 
</hibernate-mapping> 

risposta

5

Hai provato specificando cascade="all" sul tuo one-to-one mappatura?

2

Impostare l'attributo a cascata del one-to-one nel mapping aziendale.

Ma, in un'altra nota: Hai mai pensato di mappare le impostazioni aziendali come un "componente" della società anziché un'entità separata?

Non è così che "Impostazioni di società" è un "oggetto valore" e deve essere mappato meglio come componente?

In questo modo, è possibile inserire i valori di CompanySettings nella stessa tabella di "Società", ma verrà considerato come una classe separata.

Poiché si tratta di una mappatura uno-a-uno, penso che sia un'opzione migliore anche per il modello di dati.

Poi, la mappatura sarebbe simile a questa:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"`> 
    <class name="AST.Domain.Company, AST.Domain" table="Companies"> 
    <id name="EntityID" column="CompanyId"> 
     <generator class="guid.comb" /> 
    </id> 
    <property name="CompanyName" /> 
    . . . 
    <component name="Settings" class="AST.Domain.CompanySettings, AST.Domain"> 
     <property name="MaxUsers" /> 
    </component> 
    </class> 
</hibernate-mapping> 

si avrà infatti due oggetti separati (Azienda & CompanySettings, and Company avrà un oggetto 'Companysettings', ma le impostazioni verranno salvate in la tabella della società).

Oppure, c'è qualche motivo speciale sul motivo per cui hai impostato le impostazioni aziendali in una tabella separata? Voglio dire, è una relazione uno-a-uno quindi non è assolutamente necessario (e imho anche una cattiva pratica :)).