Sql server 使用SQL Server时间戳列通过代码实现乐观并发的NHibernate映射
我使用的是NHibernate 3.3.3.4000和SQL Server 2012 我搜索了一个如何使用代码映射(loquacious)来使用SQLServer时间戳(即rownumber)列配置乐观并发性的示例,但没有找到 我还使用NHibernate的SchemaExport.Create()方法来创建SQL Server数据库,因此在NHibernate创建数据库后,映射必须在SQL Server表中产生一个timestamp类型的RowVersion列 我的DTO类设置如下: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
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使用支持字段进行处理,但是由于您使用的是自动属性,因此没有支持字段。
要么没有,要么就用访问器。正确