gpt4 book ai didi

c# - 是否可以在不初始化 NHibernate 集合的情况下添加多对多关系?

转载 作者:行者123 更新时间:2023-11-30 12:37:39 24 4
gpt4 key购买 nike

这是我的类(class):

public class User
{
public int Id { get; set; }
public string Name { get; set; }

public ISet<User> Friends { get; set; }
}

这是我的映射:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
namespace="Test" assembly="test">

<class name="User" table="Users">
<id name="Id" column="id">
<generator class="native"/>
</id>
<property name="Name" column="name"/>
<set name="Friends" table="Friends">
<key column="user_id"/>
<many-to-many class="User" column="friend_id"/>
</set>
</class>
</hibernate-mapping>

问题是:

User user = session.Load<User>(1);

User friend = new User();
friend.Name = "new friend";

user.Friends.Add(friend);

在最后一行 [user.Friends.Add(friend)],我注意到它会在添加新 friend 之前初始化 Friends 集合。

我的问题是:在 NHibernate 中有没有办法避免这种行为?因为出于性能原因,我只想执行单个 INSERT 命令。

最佳答案

来自 Hibernate.org

Why does Hibernate always initialize a collection when I only want to add or remove an element?

Unfortunately the collections API defines method return values that may only be computed by hitting the database. There are three exceptions to this: Hibernate can add to a , or declared with inverse="true" without initializing the collection; the return value must always be true.

If you want to avoid extra database traffic (ie. in performance critical code), refactor your model to use only many-to-one associations. This is almost always possible. Then use queries in place of collection access.

此外,阅读此博客条目 NHibernate and Inverse=True|False Attribute , 一定会有所帮助。

[已编辑]

好吧,想想多对一和另一个多对一。其中一是一且相同。这就是为什么他们说要重构模型。您需要引入另一个实体,比如 UserFriend 之类的。现在,您将为 User-to-UserFriend、Friend-to-UserFriend 创建多对一。

因此,如您所见,这将使其成为多对多。我希望这能让重构变得清晰。你可能不想这样做,除非你真的遇到了糟糕的表现。正如 Darin 已经提到的,在其中一条评论中,不要进行过早的优化。此外,我想引用 Donald E. Knuth 臭名昭著的格言,“过早优化是万恶之源”。

关于c# - 是否可以在不初始化 NHibernate 集合的情况下添加多对多关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/406312/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com