我正在使用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不适合我们。
答案 0 :(得分:0)
摆脱" map.Access(Accessor.Field);" 这告诉nhibernate使用支持字段来处理,但是由于您使用的是自动属性,因此没有支持字段。 要么没有它,要么只使用Accessor.Proper