2012-03-09 61 views
6

我想NHibernate的生成用于实体的GUID,只有当他们没有被用户或应用程序手动设置。基本上,当用新的Guid()(全零)保存对象时,NHibernate应该生成一个。当保存具有非零Guid的对象时,应该使用它。NHibernate的GUID生成器是否有新

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

编辑人们,我知道'分配'。我应该说明我意识到这一点。既然它没有做我想做的事,那不是我正在寻找的选项。编写我自己的发电机是一个可行的选择,但我想要别的东西。我怀疑没有别的。

回答

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。此外,您将始终需要在所有NEW实体上手动设置GUID。它是一个选项。

+0

不,我没有。我不相信这会起作用,因为它会认为保存的非0值。它可能不是。因为我想自己创建一个Guid。我将在Id上设置非0值。 – wasabi 2012-03-11 18:46:50

+0

啊,那是不同的,你的问题不清楚。 – Rippo 2012-03-11 18:55:40

+0

天哪。我以为我清楚地说明了这一点。 – wasabi 2012-03-13 01:56:56

2

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

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

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

我产生对子级的类ID构造

class Entity 
{ 
    Guid id; 

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

我不关注。对象是新的。我只想让我的用户代码在调用Save之前手动设置Id值。就像'分配'一样,除了它还需要工作,如果Id == Guid.Zero – wasabi 2012-03-17 03:04:22

+0

如果你想分配用户代码中的ID,你需要使用“分配”。如果你想在用户代码不分配时创建一个id,只需在对象的构造函数中执行此操作。就这么简单。 – 2012-03-19 07:41:32

+0

斯特凡,除了我想要做的两个。 – wasabi 2012-03-19 17:01:45