NHibernate:将默认值视为null的简单方法(反之亦然)

时间:2010-06-23 01:48:34

标签: c# .net nhibernate orm

有没有人知道让NHibernate将值类型的默认值作为null插入数据库的快速方法?

例如:

public class Foo
{
    public int SomeProperty { get; set; }
}

默认情况下,int为0.当它进入数据库时​​,我希望它以null形式进入。 我知道我可以通过将SomeProperty更改为可以为空的int来实现这一点,但也许还有另一种方法吗? 我也知道我可以使用IUserType执行此操作,但是有一种简单的方法可以构建一般用于所有值类型的用户类型吗?

2 个答案:

答案 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,在加载,保存或更新时进行转换。