我想NHibernate的生成用于实体的GUID,只有当他们没有被用户或应用程序手动设置。基本上,当用新的Guid()(全零)保存对象时,NHibernate应该生成一个。当保存具有非零Guid的对象时,应该使用它。NHibernate的GUID生成器是否有新
是我写我自己的发电机唯一的选择?
编辑人们,我知道'分配'。我应该说明我意识到这一点。既然它没有做我想做的事,那不是我正在寻找的选项。编写我自己的发电机是一个可行的选择,但我想要别的东西。我怀疑没有别的。
我想NHibernate的生成用于实体的GUID,只有当他们没有被用户或应用程序手动设置。基本上,当用新的Guid()(全零)保存对象时,NHibernate应该生成一个。当保存具有非零Guid的对象时,应该使用它。NHibernate的GUID生成器是否有新
是我写我自己的发电机唯一的选择?
编辑人们,我知道'分配'。我应该说明我意识到这一点。既然它没有做我想做的事,那不是我正在寻找的选项。编写我自己的发电机是一个可行的选择,但我想要别的东西。我怀疑没有别的。
你有没有尝试设置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。它是一个选项。
这里的问题是NH需要知道对象是新的还是已经存在。它通常通过设置ID来完成。
如果您编写了自己的生成器,它不能解决问题,因为只有在对象是新的时才调用它。
assigned
生成器。我产生对子级的类ID构造
class Entity
{
Guid id;
Entity(Guid id = Guid.Empty)
{
if (id == Guid.Empty) this.id = Guid.NewGuid();
else this.id = id;
}
}
不,我没有。我不相信这会起作用,因为它会认为保存的非0值。它可能不是。因为我想自己创建一个Guid。我将在Id上设置非0值。 – wasabi 2012-03-11 18:46:50
啊,那是不同的,你的问题不清楚。 – Rippo 2012-03-11 18:55:40
天哪。我以为我清楚地说明了这一点。 – wasabi 2012-03-13 01:56:56