2009-04-07 3 views
3

J'utilise l'outil NHibernate HBM2DDL SchemaExport pour générer ma base de données à partir de mes objets d'entité, et je souhaite utiliser les colonnes d'horodatage SQL Server pour une simultanéité optimisitique.Comment obtenir NHibernate SchemaExport pour créer des colonnes d'horodatage SQL Server?

J'ai propriétés ajouté à mon objet entité qui ressemble à ceci:

octet virtuel public [] Horodatage {get; ensemble; }

NHibernate générera la colonne Timestamp, mais le type est varbinary (8000). Je préférerais utiliser le type Timestamp dans SQL Server parce que cela va s'augmenter si quelqu'un change quelque chose dans la base de données (en dehors de NHibernate). Quelqu'un sait si cela est possible et comment je peux faire ce travail?

(FWIW, j'ai suivi les instructions données here pour obtenir des colonnes d'horodatage pour travailler avec Fluent NHibernate, mais il ne semble pas que ce genre de choses aurait rien à voir avec le SchemaExport.)

Répondre

2

Répondre à ma propre question ...

Vous pouvez le faire de cette façon, ce qui implique quelques hacks: http://japikse.blogspot.com/2008/06/sql-server-timestamp-with-nhibernate-20.html?showComment=1239132960000#c6605833213839346413

Je viens de laisser NHibernate créer les colonnes varbinary et je lance un script SQL après tout réparer:

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

Ce qui précède est une bonne solution pour vous. Mais je pense que j'ai trouvé une solution de travail (voir ci-dessous) qui ne nécessite pas de script de correction post-déploiement. Mais mon post a été créé après votre post de contournement bien sûr. – granadaCoder

0

En utilisant FluentNHibernate, je suis cela fonctionne: (Certaines valeurs sont volontairement pas nommées à la convention, pour éviter toute ambiguïté.)

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

Mes tests ont travaillé, et je n'ai pas le redouté "" Impossible de mettre à jour une colonne d'horodatage "" exception.

Mon DDL apparaît comme:

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