我正在使用NHibernate HBM2DDL SchemaExport工具从我的实体对象生成我的数据库,我想使用SQL Server Timestamp列进行优化并发。
我已经向我的实体对象添加了如下所示的属性:
public virtual byte [] Timestamp {get;组; }
NHibernate将生成Timestamp列,但类型为varbinary(8000)。我宁愿在SQL Server中使用Timestamp类型,因为如果有人在数据库中更改某些内容(NHibernate之外),它会自行增加。任何人都知道这是否可能以及如何使这项工作成功?
(FWIW,我已按照发现here的说明获取时间戳列与Fluent NHibernate一起使用,但似乎这些内容与SchemaExport没有任何关系。)
答案 0 :(得分:2)
回答我自己的问题......
你可以这样做,这涉及一些黑客: http://japikse.blogspot.com/2008/06/sql-server-timestamp-with-nhibernate-20.html?showComment=1239132960000#c6605833213839346413
我只是让NHibernate创建varbinary列,然后我运行一个SQL脚本来修复所有内容:
DECLARE @sql nvarchar(255)
DECLARE @sql2 nvarchar(255)
WHILE EXISTS
(
select 1 from INFORMATION_SCHEMA.COLUMNS
where COLUMN_NAME = 'Timestamp'
and DATA_TYPE = 'varbinary'
)
BEGIN
select @sql = 'ALTER TABLE [' + table_name + '] DROP COLUMN [Timestamp]',
@sql2 = 'ALTER TABLE [' + table_name + '] ADD [Timestamp] timestamp not null'
from INFORMATION_SCHEMA.COLUMNS
where COLUMN_NAME = 'Timestamp'
and DATA_TYPE = 'varbinary'
exec sp_executesql @sql
exec sp_executesql @sql2
END
GO
嘘呀!
答案 1 :(得分:0)
使用FluentNHibernate,我得到了这个工作: (有些值是故意不命名的,以避免含糊不清。)
public partial class PetStore //: IPetStore
{
public PetStore()
{ /*Constructor*/ }
public virtual Guid? PetStoreUUID { get; set; }
public virtual byte[] TheVersionProperty { get; set; }
public virtual string PetStoreName { get; set; }
public virtual DateTime CreateDate { get; set; }
}
public class PetStoreMap : ClassMap<PetStore>
{
public PetStoreMap()
{
Id(x => x.PetStoreUUID).GeneratedBy.GuidComb();
OptimisticLock.Version();
Version(x => x.TheVersionProperty)
.Column("MyVersionColumn")
.Not.Nullable()
.CustomSqlType("timestamp")
.Generated.Always();
Map(x => x.PetStoreName);
Map(x => x.CreateDate);
}
}
我的测试工作,我没有得到可怕的 “”无法更新时间戳列“” 异常。
我的DDL显示为:
CREATE TABLE [dbo].[PetStore](
[PetStoreUUID] [uniqueidentifier] NOT NULL,
[MyVersionColumn] [timestamp] NOT NULL,
[PetStoreName] [nvarchar](255) NULL,
[CreateDate] [datetime] NULL)