NHibernate Mapping - 插入依赖项

时间:2014-07-07 08:09:32

标签: nhibernate nhibernate-mapping

我有2张桌子

帐户

-Id
-AccountName

承包商

-Id
-AccountId referneces account table
-Code

当我在承包商表中插入记录时,它应该在帐户表中将承包商的名称作为帐户名称插入,并将AccountId存储在承包商表中。

有人可以帮助我为此生成映射文件吗?我尝试了以下

Account.hbm

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="NHibernateService" assembly="NHibernateService">
  <class name="Account" table="tbl_Account" entity-name="Account">
    <id name="id" column="id">
      <generator class="native" />
    </id>
   <property name="AcName" column="AcName" type="string" length="50" />
  </class>

Contractor.hbm

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="NHibernateService" assembly="NHibernateService">
  <class name="Contractor" table="tbl_Contractor" entity-name="Contractor">
    <id name="id" column="id">
      <generator class="native" />
    </id>
    <property name="Code" column="Code" type="string" length="50"/>     
    <bag name="Account" cascade="none" lazy="false">
        <key column="Id"/>
        <one-to-many entity-name="Account" />
    </bag>    
  </class>  
</hibernate-mapping>

2 个答案:

答案 0 :(得分:1)

承包商的映射应该是安静的不同。表/模式结构表明,每个合同可以只有一个帐户......而不是更多。所以不能<bag>但我们需要<many-to-one> :(参见5.1.10. many-to-one

<class name="Contractor" table="tbl_Contractor" entity-name="Contractor">
    <id name="id" column="id">
      <generator class="native" />
    </id>
    <property name="Code" column="Code" type="string" length="50"/>     
    <!--<bag name="Account" cascade="none" lazy="false">
        <key column="Id"/>
        <one-to-many entity-name="Account" />
    </bag>-->
    <many-to-one name="Account" column="AccountId" cascade="all" >
</class>  

Contractor C#定义应该像

public class Contractor
{
    public virtual Account Account { get; set; }
    ...

所有这些对我们都有用,因为我们指示NHibernate将更改级联到第二端:

var contract = new Contract {... };
var account = new Account { .. };
contract.Account = account;

session.Save(contract); // both are persisted

答案 1 :(得分:0)

我使用NHibernate已经有一段时间了,但我相信你需要在父对象上为子集合配置cascade,在你的情况下是Contractor类。

这样,当你这样做时:

var contractor = new Contractor { Code = "XX" };
contractor.Account.Add(new Account { Name = "Account Name" });

session.Insert(contractor);

NHibernate将生成:

INSERT INTO Account ...
INSERT INTO Contractor ...

您目前将其设置为none,您可能需要allsave-update,具体取决于您是否要删除级联。查看this page了解更多信息。