【问题标题】:Insert using NHibernate for n:n relationship使用 NHibernate 插入 n:n 关系
【发布时间】:2012-08-26 14:56:12
【问题描述】:

我有 Orders、Items 和 OrderItems 实体,Orders 和 Items 表之间有 n:n 关系。我正在使用 Fluent Hibernate 进行映射,在“订单”实体中有“列表”属性,该属性具有“保护集”。我在插入时面临以下问题。

new Order.Items.Add(alreadyexistingitem);

由于其已经存在的商品,在 orderitems 表中,需要将一条记录插入到 orderitems 表中,其中包含新的 orderid 和现有的商品 id。但是只有新的订单详细信息会插入到订单表中,而不是关联表中。

在订单实体中为“items”包设置了“Inverse”属性。所以,我需要在添加如下项目时附加新添加的订单,但我该怎么做,因为它是带有保护集的列表对象。

Orders.Items.Add(alreadyexistingitem, *order = "neworder"*);

下面是映射:

   model.Override<Order>(m =>
   {      

                    m.HasManyToMany(c => c.Items)
                        .Table(Constants.TABLE_PREFIX + "OrderItem")
                        .Inverse()
                        .Cascade.AllDeleteOrphan();
    });



  model.Override<Item>(m => m.HasManyToMany(c => c.Orders)
                                            .Table(Constants.TABLE_PREFIX + "OrderItem")
                                            .Cascade.None());

【问题讨论】:

  • 您能告诉我们您当前使用的映射吗?这可能比使用映射对象更能说明根本原因。

标签: asp.net-mvc nhibernate fluent-nhibernate


【解决方案1】:

作为初步答案,NHibernate 足够聪明,可以知道何时在两个地方使用了相同的对象引用。您只需要 Order 和 Item 之间的映射中的“HasManyToMany”关系即可。

可能不应该在订单方面使用逆。 Inverse 告诉 NHibernate,关系的另一方有权定义和破坏关系。订单有物品;项目无法“选择”它们所属的顺序。

【讨论】:

  • 感谢 Keith,项目正在插入到 orderitems 表中。我仍在尝试了解“逆”属性。
  • 我对 1:n 关系有同样的疑问,比如我有客户和订单实体。因此,订单实体具有反向属性,因为没有像 *** model.Override(m => m.References(c => c.Customers).Inverse().Cascade.None()) 这样的客户,订单就无法存在;
  • 我对此进行了一些研究。我认为对于 1:n 关系,我们以相反的方式进行操作,即在父级上放置反转,以减少 NHibernate 执行的更新语句的数量。但是对于 n:n,我们需要指定实际的关系。我的理解是否正确。请发表评论。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-09
  • 1970-01-01
  • 2019-12-25
  • 1970-01-01
  • 2012-03-08
相关资源
最近更新 更多