有人可以向我解釋這個小神祕的事情,關於NHibernate如何處理複合元素。爲什麼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;
}
}
和這樣的映射;
<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>
但是,當我執行這樣的選擇;
using (ITransaction transaction = session.BeginTransaction())
{
Blog blog = session.CreateCriteria(typeof(Blog))
.SetFetchMode("Comments", FetchMode.Eager)
.Add(Expression.IdEq(2345))
.UniqueResult();
transaction.Commit();
}
NHibernate發出一個選擇與加入獲得博客與帖子但然後刪除所有評論,然後插入註釋!它爲什麼這樣做?如果我不使用事務,那麼它將只執行select而不是DELETE和INSERT,就像我期望的那樣。我錯過了什麼?我正在使用NHibernate 2.0
我認爲提交只會更新已經改變了實體 - 因爲沒有一個爲什麼會嘗試更新什麼?我也讀這個頁面http://ayende.com/Blog/archive/2008/12/28/nh-prof-alerts-use-of-implicit-transactions-is-discouraged.aspx – Gareth 2009-07-21 11:58:49
我同意你不應該使用隱式事務,我只是不清楚爲什麼你沒有做任何修改就會執行這個事務。無論如何,我喜歡這個問題,答案非常豐富! – lomaxx 2009-07-21 23:31:01