2010-02-24 12 views
0

[Mise à jour avec les fichiers de mappage]NHibernate Lazy charge/Objets - Persistance problèmes par proxy

dans un problème Ran avec un objet chargé/paresseux s'approximé persistait aujourd'hui.

Il s'agit de deux classes, Facture et Adresse. Une facture a une propriété Address. Les deux classes sont configurées pour être chargées paresseusement et toutes les méthodes sont virtuelles.

Dans le code, je fais une Invoice.address = HomeCompany.address et je peux vérifier au moment de l'exécution que l'adresse Invoice.address est correctement définie (La propriété Invoice.address est correctement affectée d'un 'proxy d'adresse'). Cependant, lorsque l'objet Invoice est conservé, les colonnes 'addresss_id' de la table de facturation sont définies sur '0'. Si toutefois, je change le fichier de mappage pour l'adresse en ajoutant 'Lazy = False' tout fonctionne très bien (la propriété invoice.address est définie sur une adresse instanciée complète). En utilisant nHibernate 2.1.2, cela me rend fou.

[Note: NHibernate ne génère pas d'erreurs]

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping default-access="field.camelcase-underscore" xmlns="urn:nhibernate-mapping-2.2"> 
<class name="TMS.Business.invoice, TMS.Business" dynamic-update="true" optimistic-lock="all" table="invoice"> 

    <id name="document_id" type="Int32"> 
     <generator class="assigned" /> 
    </id> 

    <property name="create_date" /> 
    <many-to-one name="last_updt_user" column="last_updt_userid"/> 
    <property name="last_updt_datetime" /> 

    <property name="amount" /> 
    <property name="approved_flag"/> 
    <property name="ba_document_date" /> 
    <property name="ba_document_no" not-null="true"/> 
    <property name="comment" not-null="true"/> 
    <property name="document_no" /> 
    <property name="document_no_construct"/> 
    <property name="dry_gas_billing_date" /> 
    <property name="due_date" /> 
    <property name="fin_batch_no" /> 
    <property name="fin_interface_type_cd"/> 
    <property name="fin_process_datetime" />   
    <property name="invoice_date" /> 
    <property name="netout_flag"/> 
    <property name="override_amount" /> 
    <property name="receipt_date" /> 
    <property name="void_flag"/> 

    <many-to-one name="accountant_user" column="accountant_userid"/> 
    <many-to-one name="ba" column="ba_id" property-ref="_ba_id" /> 
    <many-to-one name="ba_addr" column="ba_addr_id" property-ref="_ba_address_id" /> 
    <many-to-one name="ba_contact" column="ba_contact_id" property-ref="_ba_contact_id" /> 
    <many-to-one name="dry_gas_billing_type" column="dry_gas_billing_type_cd" property-ref="_code_key" /> 
    <many-to-one name="internal_ba" column="internal_ba_id" property-ref="_ba_id" /> 
    <many-to-one name="invoice_subtype" column="invoice_subtype_cd" property-ref="_code_key" /> 
    <many-to-one name="invoice_type" column="invoice_type_cd" property-ref="_code_key" /> 
    <many-to-one name="payment_method" column="payment_method_cd" property-ref="_code_key" /> 
    <many-to-one name="payment_term" column="payment_term_id" /> 
    <many-to-one name="remit_to_addr" column="remit_to_addr_id" property-ref="_ba_address_id"/> 

    <bag name="document_histories" lazy="true" cascade="none" inverse="true" where ="linked_table = 'invoice'" order-by="document_history_id DESC"> 
     <key column="linked_pk"/> 
     <one-to-many class="TMS.Business.document_history, TMS.Business"/> 
    </bag> 
    <bag name="trxn_pricelines" lazy="true" cascade="none" inverse="true"> 
     <key column="document_id"/> 
     <one-to-many class="TMS.Business.trxn_priceline, TMS.Business"/> 
    </bag>  

</class> 


<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping default-access="field.camelcase-underscore" xmlns="urn:nhibernate-mapping-2.2"> 
<class name="TMS.Business.ba_address, TMS.Business" optimistic-lock="version" table="_ba_address"> 

    <id name="item_guid" type="Guid"> 
     <generator class="guid" /> 
    </id> 
    <version name="version" /> 

    <property name="active_flag" /> 
    <property name="address" /> 
    <property name="city" /> 
    <property name="county" /> 
    <property name="remarks" /> 
    <property name="zip" /> 

    <many-to-one name="business_associate" column="business_associate_guid" /> 
    <many-to-one name="country" column="country_code" /> 
    <many-to-one name="state" column="state_code" /> 

    <property name="_ba_address_id" generated="insert" update="false" insert="false"/> 

</class> 

+0

Publiez vos fichiers de correspondance. – LordHits

Répondre

0

si vous ne se produira pas mapper Invoice.Address en utilisant la clé primaire (id) de l'adresse.

<class name="TMS.Business.invoice, TMS.Business" dynamic-update="true" optimistic-lock="all" table="invoice"> 

    <id name="document_id" type="Int32"> 
     <generator class="assigned" /> 
    </id> 
    <many-to-one name="ba_addr" column="ba_addr_id" /> 
</class> 

<class name="TMS.Business.ba_address, TMS.Business" optimistic-lock="version" table="_ba_address"> 
    <id name="item_guid" type="Guid"> 
     <generator class="guid" /> 
    </id> 
</class> 

Le comportement décrit ressemble _ba_address_id est mappée comme un champ, mais votre fichier de mappage suggère qu'il est une propriété. Toutefois, les noms de soulignement et de minuscules suggèrent que vous mappez des champs plutôt que des propriétés.

S'il s'agit en fait d'un champ, c'est la cause de votre problème. Pour charger un objet proxy, vous devez accéder à l'une de ses propriétés ou méthodes (virtuelles).

+0

Je ne peux pas faire cela, la classe 'Invoice' est une classe héritée et son schéma est déjà défini. Je ne peux pas modifier invoice.address pour utiliser un guid pour référencer la classe ba_address. – Andrew

+0

Et ba_address._ba_address_id est définitivement une propriété plutôt qu'un domaine? –

+0

J'ai une propriété "_ba_address_id" et un champ "__ba_address_id". J'ai choisi d'inclure le "_" supplémentaire pour m'indiquer que ces champs étaient pour un accès "hérité" par les objets hérités. – Andrew

0

Est-ce que ce pourrait être des réglages en cascade? Avez-vous défini les adresses à mettre en cascade?

+0

Cacade est pour 'collections' c'est une relation 'plusieurs-à-un'. (Une facture a une ou plusieurs entrées d'adresse) – Andrew