Nhibernate与子对象插入错误的一对一映射问题

Tal*_*Net 3 nhibernate hbm one-to-one

因为以下Nhibernate问题,我整天都在用桌子敲打桌子.

每个银行帐户都有一组(且只有一组)与之关联的费率.银行帐户表的主键BankAccountID也是外键和AccountRate表中的主键.

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; }
}
Run Code Online (Sandbox Code Playgroud)

我为BankAccount提供了以下HBM映射:

<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>
Run Code Online (Sandbox Code Playgroud)

以及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>
Run Code Online (Sandbox Code Playgroud)

可以从数据库中读取现有的BankAccount对象,没有任何问题.但是,当创建新的BankAccount时,insert语句将失败;

Cannot insert the value NULL into column 'BankAccountId'
Run Code Online (Sandbox Code Playgroud)

问题似乎是首先创建子对象AccountRate.由于尚未从其Parent获取标识符,因此插入失败.

我认为我说如果BankAccount上的AccountRate属性是一个集合,我可以使用以下内容吗?

Inverse=True
Run Code Online (Sandbox Code Playgroud)

为了强制首先插入父项.

谁能帮我这个?我真的不想使用集合,这些表之间只有一对一的单向关系.

谢谢

保罗

Tal*_*Net 5

好的,我想我已经解决了这个问题.看来我的问题是与共享主键值的经典一对一关联.通过良好的夜间睡眠找到答案,然后参考"Nhibernate in Action"的第192-193 .

首先,有一些错误需要纠正.这需要修改类和HBM文件.

首先,每个类都需要包含其他类类型的属性,因此我需要将BankAccount属性添加到AccountRate类.

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; } 
    Public virtual BankAccount BankAccount {get;set;}
} 
Run Code Online (Sandbox Code Playgroud)

我也在BankAccount HBM文件中出错,我不应该让生成器类外来.那应该是在AccountRate类上.还需要从一对一链接中删除约束.新的BankAccount HBM文件如下.

<class name="BankAccount" table="BankAccount">  
<id name ="BankAccountId" column="BankAccountId">  
  <generator class="native">  
</id>  
<property name ="AccountName" column="AccountName" />  
<one-to-one name="AccountRate" class="AccountRate" cascade="all"/>  
</class>  
Run Code Online (Sandbox Code Playgroud)

接下来,AccountRate HBM需要将生成器类设置为foreign,并添加"一对一"标记以完成类之间的关系.

<class name="AccountRate" table="AccountRate">          
<id name ="BankAccountId" column="BankAccountId">          
  <generator class="foreign">
        <param name="property">BankAccount</param>
  </generator>         
</id>          
<property name ="Rate1" column="Rate1" />          
<property name ="Rate2" column="Rate2" /> 
<one-to-one name="BankAccount" class="BankAccount" constrained="true" />       
</class>
Run Code Online (Sandbox Code Playgroud)

感谢所有花时间看这个问题的人.我想这都是曲线的一部分.

保罗