2011-06-28 32 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来促进如此。要知道最好的方法是问问你的团队是否这样做。