您可以定義使用<數據庫對象>或IAuxiliaryDatabaseObject NHibernate的一個指標。
在hbm.xml文件中:
<hibernate-mapping xmlns="urn:nhiernate-mapping-2.2">
<database-object>
<create>VALID SQL</create>
<drop>VALID SQL</create>
</database-object>
</hibernate-mapping>
注: <數據庫對象>可以在同一個hbm.xml文件中的類映射之前或之後進行,從而允許您將索引定義,觸發器等與它們所應用的對象保持一致。
另一種選擇是NHibernate.Mapping.IAuxiliaryDatabaseObject:
namespace NHibernate.Mapping {
public interface IAuxiliaryDatabaseObject : IRelationalModel {
void AddDialectScope(string dialectName);
bool AppliesToDialect(Dialect dialect);
void SetParameterValues(IDictionary<string, string> parameters);
}
public interface IRelationalModel {
string SqlCreateString(Dialect dialect, IMapping p, string defaultCatalog, string defaultSchema);
string SqlDropString(Dialect dialect, string defaultCatalog, string defaultSchema);
}
}
假設你使用功能NHibernate,IAuxiliaryDatabaseObject可能會更好地爲您。只需在構建它時暴露您的配置,然後撥打電話:
var sqlCreate = "CREATION SCRIPT";
var sqlDrop = "DROP SCRIPT";
cfg.AddAuxiliaryDatabaseObject(new SimpleAuxiliaryDatabaseObject(sqlCreate, sqlDrop));
N.B. NHibernate.Mapping.SimpleAuxiliaryDatabaseObject是NHibernate的一部分。如果您只需要爲數據庫對象提供創建/刪除腳本,則無需親自編寫它。
我快速瀏覽了Fluent NHibernate代碼庫,並沒有看到對IAuxiliaryDatabaseObject的任何直接支持。所以這是暴露你的配置對象並自己提供所有IAuxiliaryDatabaseObjects的問題。編寫一些代碼可以掃描你的映射程序集,尋找實現IAuxiliaryDatabaseObject的類型,然後通過它們傳遞給cfg.AddAuxiliaryDatabaseObject(obj),這不會太困難。
您可以找到有關NHibernate的文檔輔助數據庫對象的詳細信息:
http://nhibernate.info/doc/nh/en/index.html#mapping-database-object
+1你找到一個方法來做到這一點最終會?我有同樣的問題。 – Groo 2010-11-04 14:33:38
您是否嘗試交換映射聲明的順序? (即使它起作用,也是一種軟糖!) – UpTheCreek 2010-11-10 11:08:58
@UpTheCreek:正如Ben在下面說的,我認爲它不起作用。如果我有多個多列索引,則該方法無論如何都會失敗,因爲它會強制單列成爲* all *索引中最頂端的索引列。 – Groo 2010-11-11 12:03:13