使用Fluent NHibernate为字符串字段提供默认值

时间:2012-03-19 10:28:33

标签: c# nhibernate fluent-nhibernate

我在使用Fluent Nhibernate在字符串上设置默认值时遇到问题。我有一个varchar字段的数据库不是null,我正在尝试构建一些对象,然后将它们更新到数据库,但是因为.Net中的字符串可以为null,我在尝试更新时遇到问题实体到数据库。

我已经用Google搜索了一个解决方案,但到目前为止,“默认”这个词似乎出现在很多相关话题中,因此很难过滤掉我真正想要的内容。

我想要做的是将映射的默认值设置为空字符串,以便调用代码不需要知道数据库字段不可为空。到目前为止,只是将映射设置为.Default(string.Empty)没有用,所以我猜我错了。我可以通过添加一个构造函数调用来解决这个问题,将字段设置为实体构造函数上的空字符串,但这感觉非常讨厌,所以我正在寻找一种更好的方法来执行它,如果有一个。

所以,一些代码......

实体财产(非常香草):

public virtual string Notes { get; set; }

和制图:

Map(m => m.Notes).Default(string.Empty).Not.Nullable();

我也尝试使用文字空字符串.Default(“”),并将Not.Nullable()放在默认值之前,这两种方法都没有。

目前,我将使用构造函数调用,这样就不会阻止我,但是如果有的话,我想找到一个更好的方法。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:3)

我在将空字符串设置为默认值时也遇到了问题。请注意,我正在使用SQLite。 经过一番调查后,似乎FluentNHibernate正在生成一个关于流畅映射的“错误”SQL语句。

让我们来看看

Map(m => m.Notes).Default(string.Empty).Not.Nullable();

Map(m => m.Notes).Default("").Not.Nullable();

来自你的例子。我们期待这个SQL:

Notes TEXT DEFAULT "" NOT NULL

但它会生成

Notes TEXT 

它显然省略了“”作为默认值。使用

Map(m => m.Notes).Default(" ").Not.Nullable(); 

结果

Notes TEXT DEFAULT   NOT NULL

甚至更糟,因为它的无效SQL因为“”缺失。

使用

Map(m => m.Notes).Default("\"\"").Not.Nullable(); 

生成正确的SQL,如

Notes TEXT DEFAULT "" NOT NULL

实际上使用空字符串作为默认值。

答案 1 :(得分:1)

将属性的值设置为对象构造函数中的空字符串。

.Default(string.Empty)仅用于模式生成。这不会将此属性的值默认为对象中的空字符串。

编辑:

您还可以在映射中使用DynamicInsert()。因此,如果您没有明确地将其设置为值,则它将使用数据库默认值。

  

dynamic-insert(可选,默认为false):指定INSERT   SQL应该在运行时生成,并且只包含其列的列   值不为空。