提交前Nhibernate HiLo id值

时间:2012-03-05 11:34:57

标签: c# nhibernate

我正在开发一个应用程序,用户可以通过该应用程序发送带附件的电子邮件。电子邮件和附件域对象都将hilo定义为id生成器,如下所示:

<id name="Id">
  <generator class="hilo" />
</id>

Nhibernate使用名为 hibernate_unique_key 的表生成带有next_hi列的模式。

当用户向电子邮件添加附件时,内部应用程序会将附件对象添加到附件列表并将其绑定到网格视图,以便用户可以看到他们添加的内容。 用户可以选择以前添加的附件,然后单击“删除”按钮将其从列表中删除。 问题是,由于没有将对象保存到数据库,因此尚未分配附件的id,因此我无法唯一地标识附件obj以从列表中删除。

有没有办法在保存之前为对象分配id值?我想我不太了解hilo算法的用法,这是它的主要目的。

1 个答案:

答案 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