c# - NHibernate 一对多映射 : Insert Child Item Problem

标签 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: Unexpected row count: 0; expected: 1
    // session.Save(item);

    tran.Commit();
}

如果我取消注释 session.Save(item) 行,它将插入订单及其项目。否则,它会抛出异常“意外的行数:0;预期:1”。

如果我将 many 端(Items 属性)标记为 inverse="true",则不会抛出任何异常,但它只会插入订单!订单项不会插入到数据库中。

如果我调用 session.Save(item) 而没有调用 session.Save(order),它会同时插入订单和它的项目。

如何在不调用 session.Save(orderItem) 而只调用 session.Save(order) 的情况下保存订单及​​其订单项?谢谢!

这是我的映射:

<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 集合上没有任何级联,所以当您保存订单时它不会自动为您创建项目。

但是您确实从 Item 级联到 Order,所以当您保存 Item 时,它也会更新 Order。

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

我想你只需要添加:

<bag name="Items" cascade="all">

它会创建、更新、删除属于订单的项目。

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

关于c# - NHibernate 一对多映射 : Insert Child Item Problem,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5273526/

相关文章:

更新到数据库后 NHibernate 查询缓存不起作用

c# - 断言 C#(社交)单元测试不使用 HTTP

c# - 构建 Linq2Sql 查询时如何将对象的属性(而不是对象)传递给表达式?

c# - 使用错误的 web.config 在 azure 中部署的应用程序

c# - 如何在 c#.net windows 应用程序中检查 gridview 的行是否被选中

mysql - 使用列表时出现错误的 Fluent NHibernate Schema 输出

c# - IManyToManyCollectionInstance 约定创建额外的表

c# - 如何覆盖 express js 默认的 Keep Alive 行为

c# - 字节数组到 c# 中的双转换

c# - Lua的跨平台C#实现