提交前的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算法的用法和它的主要用途。

提交前的Nhibernate HiLo id值

使用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