2009-04-07 12 views
3

私はNHibernate HBM2DDL SchemaExportツールを使用して自分のエンティティオブジェクトからデータベースを生成していますが、SQL Serverのタイムスタンプ列を使用して最適な並行性を実現したいと考えています。SQL Serverタイムスタンプ列を作成するためのNHibernate SchemaExportの取得方法?

私はこのように私のエンティティオブジェクトにプロパティを追加しました:

パブリック仮想バイト[]タイムスタンプ{取得します。セット; }

NHibernateはTimestampカラムを生成しますが、タイプはvarbinary(8000)です。誰かがデータベース内の何かを変更すると(NHibernateの外で)、それが増えるので、私はむしろSQL ServerでTimestamp型を使用します。誰でも知っている可能性があり、私はこの仕事をすることができますか?

(FWIW、私は命令が流暢NHibernateはで動作するようにタイムスタンプ列を取得するためhereを見つけ続いているが、このようなものは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!

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); 
    } 
} 

私のテストが働い 、と私は取得できませんでした(値の一部が意図的に名前のないツー大会、あいまいさを避けるためです。):FluentNHibernateを使用して

+0

確かに良い回避策です:

私のDDLはとして表示されます。しかし、私は実際に、展開後の修正スクリプトを必要としない実用的なソリューション(下記の記事を参照)を見つけたと思います。しかし私のポストはあなたの回避策のポストの後に作成されました。 – granadaCoder

0

、私はこれは動作するようになりました ""タイムスタンプ列を更新できません "" 例外です。上記

CREATE TABLE [dbo].[PetStore](
    [PetStoreUUID] [uniqueidentifier] NOT NULL, 
    [MyVersionColumn] [timestamp] NOT NULL, 
    [PetStoreName] [nvarchar](255) NULL, 
    [CreateDate] [datetime] NULL) 
関連する問題