提交前的Nhibernate HiLo id值
本文关键字:id HiLo Nhibernate 提交 | 更新日期: 2023-09-27 18:26:58
我正在开发一个应用程序,用户可以通过该应用程序发送带有附件的电子邮件。电子邮件和附件域对象都将hilo定义为id生成器,如下所示:
<id name="Id">
<generator class="hilo" />
</id>
Nhibernate使用名为hibernate_unique_key的表和next_hi列生成模式。
当用户向电子邮件添加附件时,内部应用程序会将附件对象添加到附件列表中,并将其绑定到网格视图,以便用户可以查看他们添加的内容。用户可以选择以前添加的附件,然后单击"删除"按钮将其从列表中删除。问题是,由于没有一个对象保存到数据库中,附件的id还没有分配,所以我无法唯一地识别要从列表中删除的附件对象。
有没有一种方法可以在保存对象之前为其分配id值?我想我不太了解hilo算法的用法和它的主要用途。
使用HiLo,这样就可以在不往返于数据库的情况下分配标识符。你需要做的是这样的事情(你需要考虑删除附件和异常处理等):
private void CreateNewEmail_Click(object sender, EventArgs e)
{
// start a transaction so that all our objects are saved together.
this.transaction = this.session.BeginTransaction();
this.currentEmail = new Email();
}
private void AddAttachment_Click(object sender, EventArgs e)
{
var attachment = new Attachment();
// set the properties.
// Add it to the session so that the identifier is populated (no insert statements are sent at this point)
this.session.Save(attachment);
// Also add it to the email
this.currentEmail.Attachments.Add(attachment);
}
private void SendEmail_Click(object sender, EventArgs e)
{
// Commit the transaction (at this point the insert statements will be sent to the database)
this.transaction.Commit();
}
这里有几个链接也可以帮助你更好地理解HiLo和NHibernate:
http://ayende.com/blog/3915/nhibernate-avoid-identity-generator-when-possible
http://nhforge.org/blogs/nhibernate/archive/2009/03/20/nhibernate-poid-generators-revealed.aspx