【问题标题】:NHibernate Concurrency Windows Service ASP.NET MVC WebsiteNHibernate 并发 Windows 服务 ASP.NET MVC 网站
【发布时间】:2012-11-02 15:41:06
【问题描述】:

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

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

这个属性随机失去它的价值,我不知道是什么原因造成的。用户通过 MVC 前端更新它,但我的直觉是 Windows 服务正在用实体的旧实例覆盖它的值(Windows 服务更新同一类的另一个属性)。

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

亲切的问候

山姆

【问题讨论】:

    标签: nhibernate concurrency fluent-nhibernate fluent


    【解决方案1】:

    一个选项可以使用<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"                           
    />
    

    【讨论】:

    • 因此,当 Windows 服务进行更新并抛出 StaleObjectException 时,我可以通过再次读取(获取最新版本并重新应用更改?)来管理它,如果是这样,我该怎么做在通用存储库中?我会只使用反射来更新每个不同的值吗?
    • @SamLad 不要使用反射,让存储库能够处理这种情况
    • 感谢 Felice,因此,如果我让使用下面通用存储库的存储库管理并发,因为每个方法都知道哪些属性已更改。比我希望的更大的工作,但这是有道理的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多