2010-05-14 21 views

回答

4

不,這是不可能的。描述是Microsoft特定的元數據屬性,NHibernate和Fluent NHibernate都儘可能保持數據庫不可知。

您可以使用SqlInsert映射來完成此操作,但它不會很好。

1

這不是不可能的,但是沒有這樣的API由Fluent NHibernate提供,也沒有NHibernate本身。

你必須編寫一些代碼來檢查NHibernate創建數據庫後生成的數據庫結構,然後編寫好的舊SQL語句來自己設置描述。

也許你可以創建一個流利的NHibernate「約定」,它記錄創建了哪些表以及哪些列在那裏,然後你可以很容易地編寫手動設置描述的代碼。
(我會寫一些代碼對你來說,如果需要)。

1

如果你真的需要這一點,你可以在列描述映射到這將存儲描述爲保存/載入「保持件」表。該持有者表需要一個SchemaName,TableName,ColumnName和Description列。在此表上添加一個TRIGGER,它將執行SQL Server的sp_addextendedproperty (Transact-SQL)sp_dropextendedproperty (Transact-SQL)命令,以將描述添加到/從適當的schema.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 

此代碼將回滾並中止觸發r如果DescriptionHolder與數據庫中的實際列描述不同步,則爲100%。

+0

雖然我喜歡你的想法,但對於我想達到的目標而言,這是太多工作。 – Simon 2010-05-22 07:21:33

相關問題