有没有人知道让NHibernate将值类型的默认值作为null插入数据库的快速方法?
例如:
public class Foo
{
public int SomeProperty { get; set; }
}
默认情况下,int为0.当它进入数据库时,我希望它以null形式进入。 我知道我可以通过将SomeProperty更改为可以为空的int来实现这一点,但也许还有另一种方法吗? 我也知道我可以使用IUserType执行此操作,但是有一种简单的方法可以构建一般用于所有值类型的用户类型吗?
答案 0 :(得分:3)
这不是简单的方法,使NHibe将0转换为null,反之亦然,但是另一种建议(在您的情况下可能或可能不正确)。
Imo,使用默认值表示null是反模式;也许你同意。我认为你试图用一个合适的数据库连接一些遗留代码;那是对的吗?如果您控制要映射的业务类(类Foo),那么我建议公开Someulperty的可空版本以便继续使用:
public class Foo
{
/// for new code, and for mapping to the database:
public int? SomeProperty_new {get;set;}
/// for legacy code only. Eventually, refactor legacy code to use SomeProperty_new instead, and just remove this needless property.
[Obsolete("This uses default value to mean null. Use SomeProperty_new instead.")]
public int SomeProperty_old
{
get
{
if (SomeProperty_new == null)
return 0;
else
return SomeProperty_new;
}
set { /* convert from 0 to null if necessary and set to SomeProperty_new.*/ }
}
}
但是,你会想要比SomeProperty_new和SomeProperty_old更好的名字。
另一方面,如果0永远不是有效值(除了表示null),您可以改为使用不可为空的值。这实际上取决于手头的情况。
答案 1 :(得分:1)
您可以使用NHibernate event architecture并插入一个Listener,在加载,保存或更新时进行转换。