我有两个课程:Order
和User
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抱歉我的英语不好。
答案 0 :(得分:0)
如果我们希望将User
与Order
保持一致,我们可以使用级联设置:
使用多对一元素声明与另一个持久类的普通关联。关系模型是多对一关联。 (它实际上只是一个对象引用。)
<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
映射