我正在使用我的流利的nhibernate映射來生成我的MS SQL Server數據庫。是否可以使用流暢的nhibernate映射來設置SQL服務器列的描述?
我希望能夠將列的描述設置爲這一代的一部分。
我正在使用我的流利的nhibernate映射來生成我的MS SQL Server數據庫。是否可以使用流暢的nhibernate映射來設置SQL服務器列的描述?
我希望能夠將列的描述設置爲這一代的一部分。
不,這是不可能的。描述是Microsoft特定的元數據屬性,NHibernate和Fluent NHibernate都儘可能保持數據庫不可知。
您可以使用SqlInsert
映射來完成此操作,但它不會很好。
這不是不可能的,但是沒有這樣的API由Fluent NHibernate提供,也沒有NHibernate本身。
你必須編寫一些代碼來檢查NHibernate創建數據庫後生成的數據庫結構,然後編寫好的舊SQL語句來自己設置描述。
也許你可以創建一個流利的NHibernate「約定」,它記錄創建了哪些表以及哪些列在那裏,然後你可以很容易地編寫手動設置描述的代碼。
(我會寫一些代碼對你來說,如果需要)。
如果你真的需要這一點,你可以在列描述映射到這將存儲描述爲保存/載入「保持件」表。該持有者表需要一個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%。
雖然我喜歡你的想法,但對於我想達到的目標而言,這是太多工作。 – Simon 2010-05-22 07:21:33