我在使用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()放在默认值之前,这两种方法都没有。
目前,我将使用构造函数调用,这样就不会阻止我,但是如果有的话,我想找到一个更好的方法。
非常感谢任何帮助。
答案 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应该在运行时生成,并且只包含其列的列 值不为空。