如何为某些类中的其他类创建映射?

时间:2014-10-23 08:21:28

标签: c# nhibernate nhibernate-mapping

我有两个课程:OrderUser

Order内有User个课程:

[DataMember]
public virtual User User { get; set; }

我有两个NHibernate映射:

对于用户:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
                   assembly="Purchasing" namespace="Purchasing.Other">
  <class name="User" table="tUser">
    <id name="RID">
      <column name="RID" sql-type="bigint"/>
      <generator class="native"/>
    </id>
    <property name="Created"/>
    <property name="Modified"/>
    <property name="UserName"/>
    <property name="Email"/>
    <property name="ExternalUserId"/>   
  </class>
</hibernate-mapping>

我尝试将User类添加到Order映射,但看起来有些不对劲:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   assembly="Purchasing" namespace="Purchasing.Other">
  <class name="Order" table="tOrder">
    <id name="Id">
      <column name="OrderId" sql-type="bigint"/>
      <generator class="native" />
    </id>
    <property name="DataOwnerId" />
    <property name="UserId" />
    <property name="OrderNo"/>
    <property name="FirstTaken"/>
    <property name="DateRequired" />
    <property name="ExternalOrderId" />
    <many-to-one name="User" class="User" property-ref="ExternalUserId">
      <column name="UserId" not-null="false"/>
    </many-to-one>     
  </class>
</hibernate-mapping>

我有一种情况,当在tOrder数据库中编写Order时,我还需要将其User写入tUser数据库。 但看起来它没有用。 (没有用户地图的订单映射正常工作)

在这种情况下,映射应该如何正确,以及我缺少什么?

P.S抱歉我的英语不好。

1 个答案:

答案 0 :(得分:0)

如果我们希望将UserOrder保持一致,我们可以使用级联设置:

5.1.10. many-to-one

  

使用多对一元素声明与另一个持久类的普通关联。关系模型是多对一关联。 (它实际上只是一个对象引用。)

<many-to-one
        name="PropertyName"                                (1)
        ...
        cascade="all|none|save-update|delete"              (4)
        ...
/>
  

(4) cascade (optional): 指定应将哪些操作从父对象级联到关联对象。

所以映射可能是这样的:

<many-to-one name="User" class="User" 
        property-ref="ExternalUserId" 
        cascade="save-update"
        column="UserId" not-null="false" 
/>   

现在,我们只需要确定,我们会尝试找到一个用户(可能存在)

var user = session.Get<User>(userId);
if(user == null)
{
    user = new User { ... };
}

然后我们可以将该用户分配给订单

var order = new Order { ... };
order.User = user;

并调用会话以保持订单 - 用户也将如此:

session.SaveOrUpdae(order);

注意:如果您可以通过其本机ID引用用户......那会更好。然后映射看起来像:

<many-to-one name="User" class="User"             
        cascade="save-update"
        column="RID" not-null="false" 
/>  

应特别使用property-ref映射