这是我的课:

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/

10-13 06:55