Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# NHibernate一对多映射:插入子项问题_C#_.net_Nhibernate_One To Many - Fatal编程技术网

C# NHibernate一对多映射:插入子项问题

C# NHibernate一对多映射:插入子项问题,c#,.net,nhibernate,one-to-many,C#,.net,Nhibernate,One To Many,这是我的密码: Order order = new Order { ... }; OrderItem item = new OrderItem { ... }; order.Items.Add(item); item.Order = order; using(var tran = session.BeginTransaction()) { session.Save(order); // Without this, an exception will be thrown: Une

这是我的密码:

Order order = new Order { ... };
OrderItem item = new OrderItem { ... };
order.Items.Add(item);
item.Order = order;

using(var tran = session.BeginTransaction()) {
    session.Save(order);
    // Without this, an exception will be thrown: Unexpected row count: 0; expected: 1
    // session.Save(item);

    tran.Commit();
}
如果我取消对session.Saveitem行的注释,它将插入订单及其项目。否则,它抛出异常意外的行计数:0;预期:1

如果我将many end Items属性标记为inverse=true,则不会引发异常,但它只插入顺序!订单项将不会插入数据库

如果我调用session.Saveitem而不调用session.Saveorder,它将同时插入订单及其项

如何在不调用session.SaveorderItem而只调用session.Saveorder的情况下保存订单及其订单项?谢谢

以下是我的映射:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="Core" assembly="Core">
  <class name="Order" table="[Order]">
    <id name="Id">
      <generator class="assigned" />
    </id>

    <property name="Name" />
    <bag name="Items">
      <key column="CategoryId" />
      <one-to-many class="Core.OrderItem, Core"/>
    </bag>
  </class>

  <class name="OrderItem">
    <id name="Id">
      <generator class="assigned" />
    </id>
    <property name="Title" />
    <many-to-one name="Order" column="OrderId" cascade="save-update" not-null="true" />
  </class>

</hibernate-mapping>

因为在Order.Items集合上没有任何级联,所以在保存订单时,它不会自动为您创建项目

但您确实会从一个项目级联到另一个订单,所以当您保存项目时,它也会更新订单

当您指定inverse=true时,您告诉NHibernate不要自动更新Item.Order属性,您将手动处理该属性。因此,当您将订单添加到集合中时,订单永远不会关联,因此在提交之后,订单永远不会显示在集合中

我想你只需要补充一下:

<bag name="Items" cascade="all">
它将创建、更新和删除属于订单的项目


编辑:当然,cascade在包上进行,而不是一对多节点。

因为订单上没有任何cascade。Items集合,它不会在保存订单时自动为您创建项目

但您确实会从一个项目级联到另一个订单,所以当您保存项目时,它也会更新订单

当您指定inverse=true时,您告诉NHibernate不要自动更新Item.Order属性,您将手动处理该属性。因此,当您将订单添加到集合中时,订单永远不会关联,因此在提交之后,订单永远不会显示在集合中

我想你只需要补充一下:

<bag name="Items" cascade="all">
它将创建、更新和删除属于订单的项目


编辑:当然,级联在包中进行,而不是一对多节点。

尝试将级联放在订单映射中:

<bag name="Items" cascade="all">
  <key column="CategoryId" />
  <one-to-many class="Core.OrderItem, Core"/>
</bag>

尝试将级联放入顺序映射中:

<bag name="Items" cascade="all">
  <key column="CategoryId" />
  <one-to-many class="Core.OrderItem, Core"/>
</bag>