我正在开发一个应用程序,用户可以通过该应用程序发送带附件的电子邮件。电子邮件和附件域对象都将hilo定义为id生成器,如下所示:
<id name="Id">
<generator class="hilo" />
</id>
Nhibernate使用名为 hibernate_unique_key 的表生成带有next_hi列的模式。
当用户向电子邮件添加附件时,内部应用程序会将附件对象添加到附件列表并将其绑定到网格视图,以便用户可以看到他们添加的内容。 用户可以选择以前添加的附件,然后单击“删除”按钮将其从列表中删除。 问题是,由于没有将对象保存到数据库,因此尚未分配附件的id,因此我无法唯一地标识附件obj以从列表中删除。
有没有办法在保存之前为对象分配id值?我想我不太了解hilo算法的用法,这是它的主要目的。
答案 0 :(得分:4)
使用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