NHibernate Guid发电机如果是新的

时间:2012-03-09 20:00:54

标签: nhibernate

我希望NHibernate只有在没有由用户或应用程序手动设置时才为实体生成guid。基本上,当使用新的Guid()(全零)保存对象时,NHibernate应该生成一个。保存具有非零Guid的对象时,应该使用它。

我唯一的选择是编写自己的发电机吗?

编辑有些人,我知道'已分配'。我应该指明我知道它。由于它不能做我想做的事,它不是我正在寻找的选项。编写我自己的生成器是一个有效的选项,但我想要别的东西。我怀疑没有别的。

2 个答案:

答案 0 :(得分:2)

这里的问题是NH需要知道对象是新的还是已经存在。它通常通过设置ID来实现。

如果您编写了自己的生成器,则无法解决问题,因为只有在对象是新的时才会调用它。

  • 您可以使用assigned生成器。
  • 您可以使用版本列来指示对象是否为新对象。我从来没有尝试过这种方式,但它应该有效。如果对象是新的,则没有NH的任何指示会导致相当多的麻烦。相信我。
  • 您还可以将整数作为主键,将GUID作为常规唯一字段。

我会在类'constructor

中生成id
class Entity
{
  Guid id;

  Entity(Guid id = Guid.Empty)
  {
    if (id == Guid.Empty) this.id = Guid.NewGuid();
    else this.id = id;
  }
}

答案 1 :(得分:1)

您是否尝试过设置unsaved-value属性?

<id name="Id" column="Id" type="Guid" unsaved-value="00000000-0000-0000-0000-000000000000">
  <generator class="guid.comb" />
</id>

编辑现在我完全理解你的问题另一种选择,而不是推出自己的发电机就是使用

<generator class="assigned" /> 

但是您无法使用SaveOrUpdate()。相反,如果要通过调用ISession的Save()或Update()方法来保存或更新对象,则必须明确指定NHibernate。此外,您始终需要在所有新实体上手动设置GUID。这是一个选择。