Nhibernate One-to-one mapping issue with child object insert error
- by TalkDotNet
Hi,
i've being banging my head against the desk all day with the following Nhibernate problem.
Each bank account has one (and only one) set of rates associated with it. The primary key of the bank account table, BankAccountID is also a foreign key and the primary key in the rates table.
public class BankAccount
{
public virtual int BankAccountId { get; set; }
public virtual string AccountName { get; set;}
public virtual AccountRate AccountRate {get;set;}
}
public class AccountRate
{
public virtual int BankAccountId { get; set; }
public virtual decimal Rate1 { get; set; }
public virtual decimal Rate2 { get; set; }
}
I have the following HBM mappings for BankAccount:
<class name="BankAccount" table="BankAccount">
<id name ="BankAccountId" column="BankAccountId">
<generator class="foreign">
<param name="property">
AccountRate
</param>
</generator>
</id>
<property name ="AccountName" column="AccountName" />
<one-to-one name="AccountRate" class="AccountRate" constrained="true" cascade="save-update"/>
</class>
and the following for AccountRate:
<class name="AccountRate" table="AccountRate">
<id name ="BankAccountId" column="BankAccountId">
<generator class="native" />
</id>
<property name ="Rate1" column="Rate1" />
<property name ="Rate2" column="Rate2" />
</class>
An existing BankAccount object can be read from the database with no problem. However, when a new BankAccount is created , the insert statement fails with;
Cannot insert the value NULL into column 'BankAccountId'
The issue appears to be that the child object , AccountRate is created first and since it hasn't yet got an identifier from its uncreated parent , the insert fails.
I think i'm correct in saying that if the AccountRate property on BankAccount was a collection i could use the following ?
Inverse=True
in order to force the parent to be inserted first.
Can anyone help me with this? i Really dont want to use a collection as there is only a unidirectional one to one relationship between these tables.
Thanks
Paul