使用SQL Server时间戳列的NHibernate映射用于乐观并发的代码

时间:2014-06-05 17:14:24

标签: sql-server nhibernate concurrency

我正在使用NHibernate 3.3.3.4000和SQL Server 2012.

我已经搜索过,但没有找到一个如何使用SQL Server时间戳(即rownumber)列配置乐观并发的代码示例(loquacious)的示例。

我还使用NHibernate的SchemaExport.Create()方法来创建SQL Server数据库,因此在NHibernate创建数据库之后,映射必须在SQL Server表中生成类型为timestamp的RowVersion列。

我的DTO课程设置如下:

public class TestDto {
  public virtual Guid Id { get; set; }
  public virtual string Name { get; set; }
  public virtual Byte[] RowVersion { get; set; }
}

Ayende在此解释了如何使用XML映射和SQL Server时间戳列设置乐观并发。我尝试使用代码映射(如下所示)模仿这种方法都以某种方式失败。

http://ayende.com/blog/3946/nhibernate-mapping-concurrency

以下是乐观并发的代码映射示例,但它没有使用SQL Server时间戳列 - 我尝试猜测使其与时间戳列一起使用所需的更改失败:

http://notherdev.blogspot.com/2012/01/mapping-by-code-concurrency.html

以下是我在代码映射方面的非工作尝试,该代码基于我在前两篇文章中可以确定的最佳方式:

  public TestMap() {
     Table( "Test" );

     DynamicUpdate( true );

     Id( x => x.Id, map => {
        map.Column( "ID" );
        map.Generator( Generators.GuidComb );
     } );

     Version( x => x.RowVersion, map => {
        map.Column( "RowVersion" );
        map.Generated( VersionGeneration.Always );
        map.UnsavedValue( null );
        map.Insert( true );
        //map.Type( new TimestampType() );       // Creates a datetime (not null) column.
        //map.Type( new BinaryBlobType() );      // Creates a VARBINARY(MAX) (not null) column.
        //map.Access( Accessor.Field );          // Causes error: Could not find property nor field 'RowVersion' in class 'SQC.Repository.Dtos.DataGroupDto'
     } );

     Property( x => x.Name, map => {
        map.Column( "Name" );
        map.NotNullable( true );
     } );
  }

当我取消注释这一行时,创建的表的RowVersion为" datetime(非null)" - 我需要一个SQL Server时间戳类型。

map.Type( new TimestampType() );       // Creates a datetime (not null) column.

当我取消注释这一行时,创建的表的RowVersion为" VARBINARY(MAX)(非空)" - 我需要一个SQL Server时间戳类型。

map.Type( new BinaryBlobType() );      // Creates a datetime (not null) column.

当我取消注释此行时,我在运行时收到此错误"无法找到属性或字段' RowVersion'在课堂上' TestDto'"。

map.Access( Accessor.Field );

我希望有人可以解释如何使用代码映射(loquacious)来完成这项工作。该项目大力致力于按代码映射,因此Fluent NHibernate不适合我们。

1 个答案:

答案 0 :(得分:0)

摆脱" map.Access(Accessor.Field);" 这告诉nhibernate使用支持字段来处理,但是由于您使用的是自动属性,因此没有支持字段。 要么没有它,要么只使用Accessor.Proper