流畅的NHibernate约定:OptimisticLock.Is(x => x.Version())不起作用

时间:2017-02-16 16:11:33

标签: nhibernate fluent-nhibernate fluent-nhibernate-mapping

我在使用OptimisticLock作为约定时遇到问题。 但是,在Individual ClassMap中使用OptimisticLock可以正常工作。它抛出Stale State Object Exceptions。

对应于数据库中的表的每个类都有一个DateTime类型的属性(对应于表中的列),我试图使用OptimisticLock.Version()来锁定它。

只有当我在每个ClassMap中使用它时才有效,我不想写这么多ClassMaps,而是想要使用自动映射。

它在类地图

中的工作方式如此

Version(x => x.UpdTs).Column("UPD_TS"); OptimisticLock.Version();

所以,我开始使用下面的公约,但它没有工作。

OptimisticLock.IsAny(x => x.Version());

我尝试设置DynamicUpdate等。似乎没有什么对我有用。 请帮忙 !

1 个答案:

答案 0 :(得分:0)

以下是我使用公约所做的工作:

/// <summary>
/// Class represents the Convention which defines which Property/Column serves as a part of the Optimistic Locking Mechanism.
/// </summary>
public class VersionConvention : IVersionConvention, IVersionConventionAcceptance
{
    public void Accept(IAcceptanceCriteria<IVersionInspector> criteria)
    {
        criteria.Expect(x => x.Name == "%COLUMN_NAME%");
    }

    /// <summary>
    /// Method applies additional overrides to the <see cref="IVersionInstance"/>
    /// </summary>
    /// <param name="instance"><see cref="IVersionInstance"/></param>
    public void Apply(IVersionInstance instance)
    {            
        instance.Column("%COLUMN_NAME%");
    }
}
上面的

%COLUMN_NAME%是用于使用版本锁定的属性。

然后在创建FluentConfiguration对象时指定Version应该用于乐观锁定,就像这样

OptimisticLock.Is(x => x.Version();