NHibernate:将对象插入集合

NHibernate: insert object to collection

我的 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

它向数据库中插入了订单,但是 table OrderProductModel 仍然是空的。我真的不想手动插入 orderProduct,我希望 NHibernate 可以为我做到这一点,但我不知道该怎么做。

你快到了。因为我们使用了 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

Alternatively, NHibernate provides a command-oriented API that may be used for streaming data to and from the database in the form of detached objects. A IStatelessSession has no persistence context associated with it and does not provide many of the higher-level life cycle semantics. In particular, a stateless session does not implement a first-level cache nor interact with any second-level or query cache. It does not implement transactional write-behind or automatic dirty checking. Operations performed using a stateless session do not ever cascade to associated instances.

所以没有办法从我们确实有级联的事实中获利

要走的路是:

session.Save(order);
session.Save(p1);
session.Save(p2);