Asp.net mvc 使用NHibernate为n:n关系插入

Asp.net mvc 使用NHibernate为n:n关系插入,asp.net-mvc,nhibernate,fluent-nhibernate,Asp.net Mvc,Nhibernate,Fluent Nhibernate,我有Orders、Items和OrderItems实体,在Orders和Items表之间有n:n关系。我使用fluenthibernate进行映射,在“Order”实体中有“List”属性,该属性具有“protectiveset”。我在插入时面临以下问题 new Order.Items.Add(alreadyexistingitem); 由于orderitems表中已有该记录的项,因此需要使用新的orderid和现有项id将其插入orderitems表中。但只有新的订单详细信息插入到订单表中,

我有Orders、Items和OrderItems实体,在Orders和Items表之间有n:n关系。我使用fluenthibernate进行映射,在“Order”实体中有“List”属性,该属性具有“protectiveset”。我在插入时面临以下问题

new Order.Items.Add(alreadyexistingitem);
由于orderitems表中已有该记录的项,因此需要使用新的orderid和现有项id将其插入orderitems表中。但只有新的订单详细信息插入到订单表中,而不是关联表中

订单实体中的“项目”包设置“反向”属性。因此,我需要附加新添加的顺序,同时添加如下项目,但如何才能这样做,因为它是具有保护集的列表对象

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());
model.Override(m=>
{      
m、 HasManyToMany(c=>c.Items)
.Table(Constants.Table_前缀+OrderItem)
.Inverse()
.Cascade.AllDeleteOrphan();
});
model.Override(m=>m.HasManyToMany(c=>c.Orders)
.Table(Constants.Table_前缀+OrderItem)
.Cascade.None());

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


在订单端可能不应使用反向。逆向告诉NHibernate,关系的另一面有权定义和打破关系。订单有项目;项目不能“选择”它们所属的顺序。

能否向我们展示您当前使用的映射?这可能比映射对象的使用更能说明根本原因。感谢Keith,items正在被插入orderitems表。我仍在试图理解“反向”属性。我对1:n关系有同样的怀疑,比如说我有客户和订单实体。因此,order实体具有反向属性,因为order如果没有像***model.Override这样的customer就不能存在(m=>m.References(c=>c.Customers).inverse().Cascade.None());我对此做了一些研究。我认为对于1:n关系,我们以相反的方式进行,即在父级上放置反转,以减少NHibernate执行的update语句的数量。但是对于n:n,我们需要指定实际关系。我的理解正确吗。请评论。