透過映射檔屬性精確控制 DDL:
| 需求 | 映射寫法 | 生成 SQL 片段 |
|---|---|---|
| 非空 + 長度 | <property name="Name" not-null="true" length="50"/> | Name NVARCHAR(50) not null |
| 外鍵命名 | <many-to-one ... foreign-key="FK_Product_Category"/> | constraint FK_Product_Category foreign key ... |
| 唯一約束 | unique="true" | Name NVARCHAR(50) not null unique |
| 複合唯一鍵 | 兩欄位同 unique-key="UK_Customer_Name" | unique (FirstName, LastName) |
| 索引 | index="IDX_Product_Name" | create index IDX_Product_Name on ProductSchema (Name) |
| Check 約束 | <column name="UnitsOnStock" check="UnitsOnStock >= 0"/> | UnitsOnStock INT null check(UnitsOnStock >= 0) |
映射檔使用 <database-object>:
<database-object>
<create>CREATE PROCEDURE entitySProcs AS SELECT ...</create>
<drop>DROP PROCEDURE entitySProcs</drop>
</database-object>
NHibernate 會將視圖映射類別誤認為資料表並建立同名表。解法:加入額外 <database-object> 在建立階段 DROP TABLE 再建立視圖。
<database-object>
<create>drop table dbo.viewCustomer</create>
<drop>drop table dbo.viewCustomer</drop>
</database-object>
<database-object>
<create>CREATE VIEW [dbo].[viewCustomer] AS SELECT ...</create>
<drop>drop view dbo.viewCustomer</drop>
</database-object>
雙重 database-object 確保:建立時先刪表再建視圖,刪除時同時刪表與視圖。