NHibernate:将对象插入到集合中

时间:2015-04-15 13:41:01

标签: c# nhibernate collections

我的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可以为我这个,但我不知道如何。

1 个答案:

答案 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);