我的NHibernate项目中有2个类:OrderModel和OrderProductModel:
public class OrderModel
{
public OrderModel() { productList = new HashedSet<OrderProductModel>();}
(...)
public virtual ISet<OrderProductModel> productList { get; set; }
}
public class OrderProductModel
{
(...)
public virtual OrderModel orderM { get; set; }
}
我这样映射:
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="Shop.Domain.Model.Order" assembly="Shop.Domain">
<class name="OrderModel">
<id name="id" column="id">
<generator class="native" />
</id>
<set name="productList" lazy="false" inverse="true" cascade="save-update" table="OrderProductModel" >
<key column="orderM"/>
<one-to-many class="OrderProductModel"/>
</set>
(...)
</class>
</hibernate-mapping>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="Shop.Domain.Model.Order" assembly="Shop.Domain">
<class name="OrderProductModel">
<many-to-one name="orderM" class="OrderModel" column="orderM"/>
(...)
</class>
</hibernate-mapping>
现在我想通过以下方式向数据库插入订单:
var p1= new OrderProductModel{...};
var p2= new OrderProductModel{...};
var order = new OrderModel{...};
p1.orderM = order;
p2.orderM = order;
order.productList = new HashedSet<OrderProductModel>{p1, p2} // from Iesi
session.Insert(order) // session is IStatelessSession and it must be
它将命令插入到datebase,但表OrderProductModel仍为空。我真的不想手动插入orderProduct,我希望NHibernate可以为我这个,但我不知道如何。
答案 0 :(得分:1)
你快到了。因为我们使用 inverse="true"
,所以我们必须设置关系的两面
var p1= new OrderProductModel{...};
var p2= new OrderProductModel{...};
var order = new OrderModel{...};
// new lines
// these are essential part to make inverse mapping to happen
p1.orderM = order;
p2.orderM = order;
order.productList = new HashedSet<OrderProductModel>{p1, p2} // from Iesi
关键是什么?为什么这样做?
因为设置inverse =“true”我们说:NHibernate - 当你处理收集物品时 - 让它放在这些物品上。他们会关心save / udpate。所以他们必须了解关系
如果我们打电话
,这一切都将适用于标准会话session.Save(order);
session.Flush();
如果我们想使用无状态会话,我们应该知道:
13.2. The StatelessSession interface
或者,NHibernate提供了一个面向命令的API,可用于以分离对象的形式将数据流入和流出数据库。 IStatelessSession没有与之关联的持久化上下文,也没有提供许多更高级别的生命周期语义。特别是,无状态会话不实现第一级缓存,也不与任何第二级或查询缓存交互。它不实现事务性后写或自动脏检查。 使用无状态会话执行的操作不会级联到关联的实例。
所以没有办法从我们确实有级联的事实中获利
要走的路是:
session.Save(order);
session.Save(p1);
session.Save(p2);