2010-11-18 95 views
8

您是否在實際應用程序中使用SchemaExport和SchemaUpdate?最初,你創建模型,然後生成架構?它工作嗎?或者,您只用於測試...NHibernate和代碼優先

通常,我使用設計器創建數據庫(使用Visual Studio數據庫項目),然後創建映射和持久化類或EF實體。但是現在,我想用Fluent NHibernate嘗試第一種代碼方法。

我研究了SchemaExport和SchemaUpdate,發現了一些問題。例如,update不會刪除數據庫對象,如果存在表,則不會創建非空列(如可爲空),也不會在多對多表上生成主鍵等等。這意味着我必須經常重新創建db。但是,數據是什麼?並且,如何部署更改生產分貝等...

我想知道你真的先在代碼中使用代碼,然後使用SchemaExport(SchemaUpdate)嗎?可能你可以給我一些建議...

回答

8

我在生產中使用SchemaUpdate。正是因爲它從不進行像刪除列這樣的破壞性操作,所以很安全。但是,它不是更新數據庫的全面解決方案。如果你使用它,你仍然需要用腳本來補充它,以更新你的模式來完成刪除操作(如你所提到的),索引,改變列類型,添加表格數據等。但SchemaUpdate覆蓋了90%的情況。

我發現的唯一缺點是,隨着時間的推移,它似乎偶爾向我的表添加重複的外鍵約束。

還有一件事:您應該從構建工具手動運行SchemaUpdate,而不是您的應用程序本身。這是不安全給你的應用程序修改你的數據庫架構的權利!

2

是的,你可以在實際應用中使用它們;我做。

當然,幾乎所有的工作都是先發生。我的做法是創建一個單獨的項目,引用我的主項目程序集中的映射,並處理數據庫創建和初始數據導入(如果有的話)。

一旦項目投入生產,我通常會從解決方案中卸載該項目,但保留該項目以供參考,或者需要從創建腳本切換到更新腳本。

至於NHibernate創建數據庫的方式,你必須在你的Fluent映射中做更多的規範。我喜歡指定null/not null,外鍵約束名等,以最大限度地控制數據庫的創建方式。

我不認爲你會想在這種情況下使用automapping。

4

我使用SchemaUpdate/SchemaExport來快速演化我的模型,但它們不是數據庫遷移工具的替代品。正如你所提到的,在很多情況下,數據不能以合理的方式遷移。該工具沒有足夠的上下文。 (例如,如何自動將FullName列遷移到FirstName/LastName?)我在這裏回答了一個類似的問題,在這裏我討論了NHibernate環境中的db遷移工具。

NHibernate, ORM : how is refactoring handled? existing data?

1

只是任何生成代碼,無論是從工具或數據庫生成在你的問題POCO的產生,它可能會得到你的方式出現80%。從那裏調整其他20%是明智的,以增加你的索引和任何其他性能調整,讓它恰到好處。