我目前对使用版本字段为实体创建映射很感兴趣。然而,我对如何在web环境中使用版本控制感到困惑。在大多数例子中,我见过一个实体在using语句中被更新,而且是立即发生的。
在web示例中,实体在HTTP GET中获取,并且在客户端调用HTTP POST之前不会更新。我通常在post中做的是再次获取实体,更新数据并存储它。但是在我的GET和POST之间,这个实体可能已经改变了。我应该在保存之前自己检查版本字段吗?或者有更好的方法吗?
发布于 2012-11-27 17:38:16
是的,我想你需要自己去检查一下。可以这样做的一种方法是,当您在初始get中检索实体并将其发送回调用者时,在响应中包括版本号。当你写文章的时候,包括版本号。在服务器端,当您重新读取附加的nHibernate实体时,从它获取当前的版本号。如果您的版本号已过期,请停止更新。
发布于 2012-11-27 19:50:40
版本1)可以手动检查,或者2)依赖于数据库中内置的NHibernate版本控制功能和时间戳类型。(SQL Server支持它-但大多数情况下其他数据库也支持它)。在第二种情况下,我们必须处理exception。
下面将详细说明如何在NHibernate http://ayende.com/blog/3946/nhibernate-mapping-concurrency中处理并发
如果您使用的是SQL Server,则可以创建列
CREATE TABLE [dbo].[MyTable](
...
[Version] [rowversion] NOT NULL -- new keyword for deprecated [timestamp]
...然后调整版本映射:
<version name="Version" generated="always" unsaved-value="null" type="BinaryBlob">
<column name="Version" not-null="false" sql-type="timestamp" />
</version>您还应该/需要将版本号传递给客户端,并在POST时绑定它(例如base64)
每当您尝试session.Update(entity)时,NHibernate都会抛出NHibernate.StaleObjectStateException.只有在这种情况下你才能处理它。如果版本匹配,则所有操作都将正常工作,并且UPDATE语句将成功。
https://stackoverflow.com/questions/13580901
复制相似问题