2009-04-07 46 views
3

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

我补充说,像这样我的实体对象属性:

公共虚拟的byte [] {时间戳获得;组; }

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

(FWIW,我也跟着指示找到here用于获取时间戳列与功能NHibernate的工作,但它不会出现这个东西会有什么用的SchemaExport。)

回答

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 

Boo yah!

+0

以上是肯定的一个很好的解决方法。但是我想我实际上找到了一个不需要部署后修订脚本的工作解决方案(帖子见下文)。但是我的帖子是在你的解决方案帖子之后创建的。 – granadaCoder 2011-10-05 19:28:08

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)