Как получить NHibernate SchemaExport для создания столбцов меток времени SQL Server? - PullRequest
3 голосов
/ 07 апреля 2009

Я использую инструмент NHibernate HBM2DDL SchemaExport для генерации своей базы данных из объектов сущностей и хочу использовать столбцы меток времени SQL Server для оптимистического параллелизма.

Я добавил в свой объект-сущность свойства, которые выглядят так:

публичный виртуальный байт [] Timestamp {get; задавать; }

NHibernate сгенерирует столбец Timestamp, но тип это varbinary (8000). Я бы предпочел использовать тип Timestamp в SQL Server, потому что он будет увеличиваться, если кто-то что-то изменит в базе данных (за пределами NHibernate). Кто-нибудь знает, возможно ли это и как я могу заставить это работать?

(FWIW, я следовал инструкциям, найденным здесь для получения столбцов меток времени для работы с Fluent NHibernate, но не похоже, чтобы этот материал имел какое-либо отношение к SchemaExport.)

Ответы [ 2 ]

2 голосов
/ 07 апреля 2009

Отвечая на мой вопрос ...

Вы можете сделать это так, что включает в себя некоторые хаки: 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

Бу да!

0 голосов
/ 30 ноября 2010

Используя 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...