2009-04-07 4 views
3

Ich verwende das NHibernate HBM2DDL SchemaExport-Tool, um meine Datenbank aus meinen Entitätsobjekten zu generieren, und ich möchte SQL Server Timestamp-Spalten für optimistic Concurrency verwenden.Wie erhält man NHibernate SchemaExport zum Erstellen von SQL Server-Timestamp-Spalten?

Ich habe Eigenschaften meiner Entitätsobjekt hinzugefügt, die wie folgt aussehen:

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

NHibernate wird die Timestamp-Spalte generieren, aber der Typ ist varbinary (8000). Ich würde lieber den Timestamp-Typ in SQL Server verwenden, da dieser sich inkrementiert, wenn jemand etwas in der Datenbank ändert (außerhalb von NHibernate). Weiß jemand ob das möglich ist und wie ich das machen kann?

(FWIW, habe ich die Anweisungen befolgt here für das Erhalten Zeitstempel Spalte gefunden mit Fluent NHibernate zu arbeiten, aber es scheint nicht, dass dieses Zeug etwas mit dem Schema zu tun haben würde.)

Antwort

2

Beantwortung meinen eigenen Frage ...

Sie können es auf diese Weise tun, die einige Hacks beinhaltet: http://japikse.blogspot.com/2008/06/sql-server-timestamp-with-nhibernate-20.html?showComment=1239132960000#c6605833213839346413

ich lass NHibernate die varbinary Spalten erstellen und dann betreibe ich ein SQL-Skript danach alles zu beheben:

012.351.
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

Die oben eine gute Abhilfe für sicher ist. Aber ich denke, ich habe tatsächlich eine funktionierende Lösung gefunden (siehe unten), die kein Post-Deployment Fix-Skript benötigt. Aber mein Beitrag wurde nach deinem Workaround-Post natürlich erstellt. – granadaCoder

0

Mit FluentNHibernate, ich habe dies funktioniert: (Einige Werte sind absichtlich nicht-genannt-to-Konvention, um Unklarheiten zu vermeiden.)

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

Meine Tests gearbeitet, und ich habe nicht bekommen die gefürchtete "" Eine Zeitstempelspalte kann nicht aktualisiert werden "" Ausnahme.

Meine DDL zeigt sich als:

CREATE TABLE [dbo].[PetStore](
    [PetStoreUUID] [uniqueidentifier] NOT NULL, 
    [MyVersionColumn] [timestamp] NOT NULL, 
    [PetStoreName] [nvarchar](255) NULL, 
    [CreateDate] [datetime] NULL)