如何让NHibernate SchemaExport创建SQL Server时间戳列?

时间:2009-04-07 17:20:32

标签: c# sql-server nhibernate fluent-nhibernate

我正在使用NHibernate HBM2DDL SchemaExport工具从我的实体对象生成我的数据库,我想使用SQL Server Timestamp列进行优化并发。

我已经向我的实体对象添加了如下所示的属性:

public virtual byte [] Timestamp {get;组; }

NHibernate将生成Timestamp列,但类型为varbinary(8000)。我宁愿在SQL Server中使用Timestamp类型,因为如果有人在数据库中更改某些内容(NHibernate之外),它会自行增加。任何人都知道这是否可能以及如何使这项工作成功?

(FWIW,我已按照发现here的说明获取时间戳列与Fluent NHibernate一起使用,但似乎这些内容与SchemaExport没有任何关系。)

2 个答案:

答案 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)