这是我的课:
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)],我注意到它将在添加新朋友之前初始化Friends集合。
我的问题是:在NHibernate中是否有避免这种行为的方法?因为出于性能原因,我只想执行单个INSERT命令。
最佳答案
从Hibernate.org
为什么我只想添加Hibernate时总是初始化一个集合
或删除元素?
不幸的是,集合API
定义方法的返回值
只能通过点击
数据库。有三个例外
为此:Hibernate可以添加到,
或用
inverse =“ true”,无需初始化
集合;返回值必须
永远是真实的。
如果要避免额外的数据库
流量(即性能至关重要)
代码),重构模型以仅使用
多对一关联。这是
几乎总是可能的。然后使用
查询代替集合访问。
此外,阅读此博客条目NHibernate and Inverse=True|False Attribute肯定会有所帮助。
[编辑]
好吧,想想多对一和另一个多对一。其中一个是一个且相同。这就是为什么他们说要重构模型。您需要引入另一个实体,例如UserFriend之类的。现在,您将为“用户对用户朋友”,“朋友对用户朋友”建立多对一关系。
因此,如您所见,这将使它成为多对多的。我希望这使重构变得很清楚。除非您的真实性能不佳,否则您可能不想这样做。正如达林已经提到的那样,在其中一项评论中,不要进行过早的优化。此外,我想引用唐纳德·E·克努斯(Donald E. Knuth)那句臭名昭著的格言:“过早的优化是万恶之源”。
关于c# - 是否可以在不初始化集合的情况下添加多对多关系?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/406312/