有人可以向我解释NHibernate如何处理复合元素的这个小谜.
我的课程看起来像这样;
public class Blog
{
public virtual int Id
{
get;
private set;
}
public virtual ISet<Comment> Comments
{
get;
set;
}
}
public class Comment
{
public virtual string CommentText
{
get;
set;
}
public virtual DateTime Date
{
get;
set;
}
}
Run Code Online (Sandbox Code Playgroud)
和这样的映射;
<class name="Blog" table="blog">
<id name="Id" column="id" unsaved-value="0">
<generator class="hilo"/>
</id>
<set name="Comments" table="blog_comments">
<key column="blog_id" />
<composite-element class="Comment">
<property name="CommentText" column="comment" not-null="true" />
<property name="Date" column="date" not-null="true" />
</composite-element>
</set>
</class>
Run Code Online (Sandbox Code Playgroud)
但是当我执行这样的选择时;
using (ITransaction transaction = session.BeginTransaction())
{
Blog blog = session.CreateCriteria(typeof(Blog))
.SetFetchMode("Comments", FetchMode.Eager)
.Add(Expression.IdEq(2345))
.UniqueResult();
transaction.Commit();
}
Run Code Online (Sandbox Code Playgroud)
NHibernate通过连接发出一个select来获取带有帖子的博客但是删除所有注释然后插入注释!它为什么这样做?如果我不使用事务,那么它将只执行select而不是我期望的DELETE和INSERT.我错过了什么?我正在使用NHibernate 2.0
我认为你需要在Comment上覆盖Equals()和GetHashCode().NHibernate没有用于实体相等的ID,因此您必须定义使注释实体等于另一个注释的内容.
可能是错的:)
编辑
来自:http://www.nhforge.org/doc/nh/en/index.html#components-incollections(7.2)
注意:如果定义复合元素的ISet,则正确实现Equals()和GetHashCode()非常重要.
以及实现Equals/GetHashCode的示例
http://www.nhforge.org/doc/nh/en/index.html#persistent-classes-equalshashcode(4.3)
| 归档时间: |
|
| 查看次数: |
1860 次 |
| 最近记录: |