2011-06-28 68 views
1

我已經繼承了一堆Fluent NHibernate映射,這些映射目前都在他們所在的項目中工作(即應用程序使用它們並且工作)。現在我想建立一些新的映射,集成測試,從而使用所有這些 - 新老 - 生成模式,使用工作流暢的NHibernate映射呈現無效的CreateSchema SQL

new SchemaExport(Container.Resolve<Configuration>()).Create(true, true); 

然而,所執行的SQL生成的腳本有一些無效代碼。大部分的問題似乎從喜歡這兩種情況中的一個行幹:

// x.Map is string 
Map(x => x.Map).Column("Karta").Not.Nullable().Default("False"); 
// x.Active is bool 
Map(x => x.Active).Column("Aktiv").Not.Nullable().Default("True"); 

會發生什麼事是,在創建此表的語句,對應於上述映射行看起來是這樣的(他們是其實不同類型,並在不同的表):

Karta NVARCHAR(255) default False not null, 
Aktiv BIT default True not null, 

其中(顯然)False行不通,因爲不存在與該名稱的變量,布爾不要在SQL Server中存在。

我該如何解決這個問題?

我不想更改映射,因爲有一個大型應用程序使用並依賴於它們 - 我不知道(我不想知道此時此刻)多麼微妙如果我刪除默認規範,則會引入錯誤。如果我可以將"False""True"更改爲有效的東西,但這完全沒問題 - 只要非常明顯,它不會在其他地方改變任何行爲。

回答

1

可以更改。默認情況下,應用程序不會從映射獲取默認值,應用程序將從屬性的語言默認值(字符串= null,int = 0,bool = false等)接收默認值,如果屬性未在構造函數或屬性初始值設定項(C#3)中初始化。

FNH。默認僅對DDL創建有影響,應用程序行爲不會受到影響。

這是確定他們改成這樣:

Map(x => x.Map).Not.Nullable().Default("'True'"); 
Map(x => x.Aktiv).Not.Nullable().Default("0"); 

我很懷疑你的團隊緊密結合您的應用程序的功能,NH,它的方式太麻煩獲得從NH違約或FNH默認甚至有一個應用程序的屬性的默認一個API來促進如此。要知道最好的方法是問問你的團隊是否這樣做。