NHibernate多对多在插入之前删除所有关联

Kev*_*ang 4 nhibernate

我有一个Users表和一个Networks表,它们之间有多对多关系(用户可能很长到多个网络,网络可能包含很多用户).多对多关系保存在"UserNetworks"表中,该表只有两列,UserId和NetworkId.

我的课程看起来像这样:

public class User
{
    public IList<Network> Networks {get; set;}
}

public class Network
{
    public IList<Usre> Users {get; set;}
}
Run Code Online (Sandbox Code Playgroud)

这些多对多集合的NHibernate映射如下所示:

User.hbm.xml:

<bag name="Networks" table="UserNetworks" cascade="save-update" inverse="true">
    <key column="UserId" />
    <many-to-many class="Network" column="NetworkId" />
</bag>
Run Code Online (Sandbox Code Playgroud)

Network.hbm.xml:

<bag name="Users" table="UserNetworks" cascade="save-update">
    <key column="NetworkId" />
    <many-to-many class="User" column="UserId" />
</bag>
Run Code Online (Sandbox Code Playgroud)

在我的代码中,我在用户和网络之间创建了一个关联,如下所示:

user.Networks.Add(network);
network.Users.Add(user);
Run Code Online (Sandbox Code Playgroud)

我希望SQL运行只是对UserNetworks表执行一次INSERT.相反,它使用NetworkID = X在UserNetworks表上执行DELETE,然后继续重新插入所有UserNetworks行以及新关联.

我究竟做错了什么?

o.k*_*k.w 5

行为是设计的.请参阅,NH不知道列表中的当前/新/删除的内容.所以通过删除所有并插入列表中的任何内容将是有道理的.

  • 这是手册中的文字(第15.5.1节)......"包是最坏的情况.因为包允许重复的元素值并且没有索引列,所以不能定义主键.NHibernate无法区分重复NHibernate通过完全删除(在单个DELETE中)并在每次更改时重新创建集合来解决此问题.这可能效率非常低." (2认同)