Sql server 使用SQL Server时间戳列通过代码实现乐观并发的NHibernate映射

Sql server 使用SQL Server时间戳列通过代码实现乐观并发的NHibernate映射,sql-server,nhibernate,concurrency,Sql Server,Nhibernate,Concurrency,我使用的是NHibernate 3.3.3.4000和SQL Server 2012 我搜索了一个如何使用代码映射(loquacious)来使用SQLServer时间戳(即rownumber)列配置乐观并发性的示例,但没有找到 我还使用NHibernate的SchemaExport.Create()方法来创建SQL Server数据库,因此在NHibernate创建数据库后,映射必须在SQL Server表中产生一个timestamp类型的RowVersion列 我的DTO类设置如下: publ

我使用的是NHibernate 3.3.3.4000和SQL Server 2012

我搜索了一个如何使用代码映射(loquacious)来使用SQLServer时间戳(即rownumber)列配置乐观并发性的示例,但没有找到

我还使用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时间戳列设置乐观并发。我试图通过代码映射(如下所示)来模拟这种情况,但都以这样或那样的方式失败了

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

以下是我在代码映射方面的非工作性尝试,这是我在前两篇文章中所能确定的最佳映射:

  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 );
     } );
  }
当我取消注释这一行时,创建的表的行版本为“datetime(NOTNULL)”——我需要一个SQL Server时间戳类型

map.Type( new TimestampType() );       // Creates a datetime (not null) column.
map.Type( new BinaryBlobType() );      // Creates a datetime (not null) column.
当我取消注释这一行时,创建的表的RowVersion为“VARBINARY(MAX)(notnull)”——我需要一个SQL Server时间戳类型

map.Type( new TimestampType() );       // Creates a datetime (not null) column.
map.Type( new BinaryBlobType() );      // Creates a datetime (not null) column.
当我取消注释这一行时,我在运行时收到以下错误:“在类“TestDto”中找不到属性或字段“RowVersion”

我希望有人能解释如何使用代码映射(唠叨)来完成这项工作。该项目致力于通过代码进行映射,因此我们不能选择Fluent NHibernate。

摆脱“map.Access(Accessor.Field);” 这会告诉nhibernate使用支持字段进行处理,但是由于您使用的是自动属性,因此没有支持字段。 要么没有,要么就用访问器。正确