【问题标题】:NHibernate Many-To-Many Is Deleting All Associations Before InsertingNHibernate 多对多在插入之前删除所有关联
【发布时间】:2009-12-03 12:50:01
【问题描述】:

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

我的课程如下所示:

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

public class Network
{
    public IList<Usre> Users {get; set;}
}

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

用户.hbm.xml:

<bag name="Networks" table="UserNetworks" cascade="save-update" inverse="true">
    <key column="UserId" />
    <many-to-many class="Network" column="NetworkId" />
</bag>

Network.hbm.xml:

<bag name="Users" table="UserNetworks" cascade="save-update">
    <key column="NetworkId" />
    <many-to-many class="User" column="UserId" />
</bag>

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

user.Networks.Add(network);
network.Users.Add(user);

我希望 SQL 运行只对 UserNetworks 表执行一次 INSERT。相反,它在 NetworkID = X 的 UserNetworks 表上执行 DELETE,然后继续将所有 UserNetworks 行连同新关联一起重新插入。

我做错了什么?

【问题讨论】:

    标签: nhibernate


    【解决方案1】:

    行为是设计使然。看,NH 不知道列表中当前/新/已删除的内容。因此,删除所有内容并在列表中插入任何内容都是有意义的。

    【讨论】:

    • 这是手册中的文本(第 15.5.1 节)..." 包是最坏的情况。由于包允许重复的元素值并且没有索引列,因此不能定义主键。 NHibernate 无法区分重复行。NHibernate 通过完全删除(在单个 DELETE 中)并在集合发生更改时重新创建集合来解决此问题。这可能非常低效。"
    • 完美。我在我的 UserNetworks 表中添加了一个标识列并切换到一个 IdBag,它工作得很好。谢谢!
    • 太棒了!这也是我为我的项目所做的。 :)
    • 嗯,我很高兴有一个答案,虽然这不是 @o.k.w 的错,但这很糟糕。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-25
    • 1970-01-01
    • 2020-06-09
    • 2011-08-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多