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 /> </ID> <property name="name" column="name"/> <set name="FrIEnds" table="FrIEnds"> <key column="user_ID"/> <many-to-many 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.orgWhy 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中初始化集合时添加多对多关系?全部内容,希望文章能够帮你解决c# – 是否可以在NHibernate中初始化集合时添加多对多关系?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)