Можно ли задать описание столбцов SQL-сервера, используя беглую карту nhibernate? - PullRequest
3 голосов
/ 14 мая 2010

Я использую свои беглые отображения nhibernate для создания базы данных MS SQL Server.

Я бы хотел установить описание столбцов как часть этого поколения.

Ответы [ 3 ]

4 голосов
/ 17 мая 2010

Нет, это невозможно. Description - это специфический атрибут метаданных Microsoft, и NHibernate, и Fluent NHibernate пытаются оставаться настолько независимыми от базы данных, насколько это возможно.

Возможно, вы сможете сделать это, используя SqlInsert отображение, но это будет не очень приятно.

1 голос
/ 17 мая 2010

Если вам это действительно нужно, вы можете сопоставить описания столбцов с таблицей «держателей», в которой будут храниться описания для сохранения / загрузки. Эта таблица держателей будет нуждаться в столбце для SchemaName, TableName, ColumnName и Description. Добавьте TRIGGER для этой таблицы, которая будет выполнять команду sp_addextendedproperty (Transact-SQL) или sp_dropextendedproperty (Transact-SQL) SQL Server, чтобы добавить / удалить описание в / из соответствующей схемы .table.column.

таблица будет выглядеть так:

DescriptionHolder
SchemaName   sysname
TableName    sysname
ColumnName   sysname
Description  varchar(7500) --or nvarchar(3750)

триггер будет выглядеть так:

CREATE TRIGGER trigger_DescriptionHolder ON DescriptionHolder
   INSTEAD OF INSERT,UPDATE,DELETE
AS 
SET NOCOUNT ON


IF EXISTS (SELECT * FROM INSERTED)
BEGIN
    --handles INSERTS and UPDATEs
    --loop begin here over INSERTED
        EXECUTE sp_addextendedproperty N'MS_Description', <INSERTED.Description>
            ,N'SCHEMA' , <INSERTED.SchemaName>
            ,N'TABLE'  , <INSERTED.TableName>
            ,N'COLUMN' , <INSERTED.ColumnName>
    --loop end here


END
ELSE IF EXISTS(SELECT * FROM DELETED)
BEGIN
    --handles DELETEs
    --loop begin here over DELETED
    EXECUTE sp_dropextendedproperty ...
    --loop end here

END

Если вы беспокоитесь о том, чтобы таблица не синхронизировалась с реальными описаниями столбцов, вы можете добавить это в конец триггера:

IF EXISTS (SELECT 1 AS x --h.SchemaName,h.TableName,h.ColumnName
               FROM DescriptionHolder h 
               WHERE NOT EXISTS (SELECT 1  
                                     from sys.extended_properties p
                                         inner join sys.objects   o ON p.major_id=o.object_id
                                         inner join sys.schemas   s ON o.schema_id=s.schema_id
                                         inner join sys.columns   c ON o.object_id=c.object_id and p.minor_id=c.column_id
                                     where h.SchemaName=s.name AND h.TableName=o.name AND h.ColumnName=c.name)
           UNION ALL
           select 2 AS x --s.name AS SchemaName,o.name AS TableName,c.name AS ColumnName
               from sys.extended_properties p
                   inner join sys.objects   o ON p.major_id=o.object_id
                   inner join sys.schemas   s ON o.schema_id=s.schema_id
                   inner join sys.columns   c ON o.object_id=c.object_id and p.minor_id=c.column_id
               where p.class=1 and p.Name='MS_Description'
                   AND not exists (SELECT 1 FROM DescriptionHolder h WHERE s.name=h.SchemaName AND o.name=h.TableName AND c.name=h.ColumnName)
          )
    BEGIN
        RAISERROR('sys.extended_properties and DescriptionHolder do not match',16,1)
        ROLLBACK
        RETURN
    END

этот код будет выполнять откат и прерывать триггер, если DescriptionHolder не синхронизирован на 100% с фактическими описаниями столбцов в базе данных.

1 голос
/ 17 мая 2010

Это не невозможно, но нет такого API, предоставленного ни Fluent NHibernate, ни самим NHibernate.

Вам потребуется написать некоторый код для проверки получающейся структуры базы данных после того, как NHibernate создаст вашу базу данных, а затем написать старые добрые операторы SQL, чтобы самим установить описания.

Возможно, вы могли бы создать «соглашение» Fluent NHibernate, которое регистрирует, какие таблицы созданы и какие столбцы там, и затем вы могли бы легко написать код, который устанавливает описания вручную. (Я напишу какой-нибудь код для вас, если вам потребуется.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...