2012-11-02 55 views
0

我有一个Windows服务和ASP.NET MVC 2应用程序,它们都使用Fluent nHibernate(nHibernate 3)连接到同一个数据库。NHibernate并发Windows服务ASP.NET MVC网站

其中一个实体(称为Profile)具有包含图像的url的字符串属性。

此属性随机丢失它的值,我无法弄清楚是什么导致它。用户通过MVC前端进行更新,但我的直觉是Windows服务正在用实体的旧实例覆盖其值(Windows服务更新同一类中的另一个属性)。

有人可以请解释/帮助如何调试这个或最好的方式来管理并发,我已经读过这个主题,但我对nHibernate的乐观和悲观锁定感到困惑。

亲切的问候

山姆

回答

0

的选项可以使用<version/>乐观锁。有了这个,你没有性能缺陷,并且你确定结果就是你想要的。如果一个代理尝试更新之前更新的另一个代理的记录,则该代理将失败。当然,你应该以某种方式处理这个异常,但至少你没有脏更新/读取。 要使用<version/> tou应该在表中添加一列以维护版本。在标准NH映射文档:

<version 
     column="version_column"        
     name="PropertyName"         
     type="typename"          
     access="field|property|nosetter|ClassName"   
     unsaved-value="null|negative|undefined|value"  
     generated="never|always"       
/> 
+0

所以当Windows服务做的更新和StaleObjectException异常被抛出,我可以做另一次读管理这种(以获取最新版本并重新应用更改?)如果那么我怎么能在一个通用的Repository中做到这一点?我是否会使用反射来更新每个不同的值? –

+0

@SamLad不要使用反射,使存储库能够处理这种情况 –

+0

感谢Felice,因此,如果我使用下面的通用存储库管理并发性的存储库,因为每个方法都知道哪些属性已更改。比我希望的工作更大,但这是有道理的。 –