如何让NHibernate将String.Empty属性值保持为NULL

Tod*_*odd 2 .net nhibernate fluent-nhibernate

我有一个相当简单的类,我想通过NHibernate(w/Fluent映射)保存到SQL Server.该类主要由可选的字符串字段组成.

我的问题是我将类字段默认为string.empty以避免NullRefExceptions,当NHibernate将行保存到数据库时,每列包含一个空字符串而不是null.

问题:当string属性为空字符串时,有没有办法让NHibernate自动保存null?或者我需要使用if(string.empty)检查来丢弃我的代码吗?

Jam*_*Ide 7

您可以使用UserType执行此操作.我得出结论,在我的业务类中,空字符串是无用的(并且颈部疼痛)所以我将所有可空字符串数据库列转换为空字符串,反之亦然.

流利的用法是:

Map(x => x.MiddleName).CustomType(typeof(NullableString));

/// <summary>
/// UserType for string properties that are database nullable. Using this type
/// will substitue empty string for null when populating object properties
/// and null for empty string in database operations.
/// </summary>
/// <example>
/// Map(x => x.MiddleName).Length(30).Nullable().CustomType(typeof(NullableString));
/// </example>
public class NullableString : IUserType
{
    public new bool Equals(object x, object y)
    {
        if (ReferenceEquals(x, y))
        {
            return true;
        }
        if (x == null || y == null)
        {
            return false;
        }
        return x.Equals(y);
    }

    public int GetHashCode(object x)
    {
        return x.GetHashCode();
    }

    public object NullSafeGet(IDataReader rs, string[] names, object owner)
    {
        var valueToGet = NHibernateUtil.String.NullSafeGet(rs, names[0]);
        return valueToGet ?? string.Empty;
    }

    public void NullSafeSet(IDbCommand cmd, object value, int index)
    {
        var stringObject = value as string;
        object valueToSet = string.IsNullOrEmpty(stringObject) ? null : stringObject;
        NHibernateUtil.String.NullSafeSet(cmd, valueToSet, index);
    }

    public object DeepCopy(object value)
    {
        return value;
    }

    public object Replace(object original, object target, object owner)
    {
        return original;
    }

    public object Assemble(object cached, object owner)
    {
        return DeepCopy(cached);
    }

    public object Disassemble(object value)
    {
        return DeepCopy(value);
    }

    public SqlType[] SqlTypes
    {
        get
        {
            return new[] { new SqlType(DbType.String)};
        }
    }

    public Type ReturnedType
    {
        get { return typeof(string); }
    }

    public bool IsMutable
    {
        get { return false; }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 遗留系统,严格的DBA,数据库不完全在我的控制之下,数据库由其他系统访问,等等. (5认同)

Abe*_*bel 5

NHibernate正在做你要求它做的事情.一方面,你说你试图避免NullReferenceException,另一方面NULL,当一个值不为空时,你试图保存在数据库中.这听起来像是一个矛盾.而不是尝试解决此功能错误,尝试允许空值(并检查数据以防止NRE)或不允许空值.

如果您想要使用NULL字段和空字段覆盖特殊情况,请考虑读取正确的数据(并且不要初始化String.Empty).如果将空字符串视为等于该数据库中的空值,则只需将所有字段初始化为空字符串,以使其保持简单和一致.

  • "功能错误"?我肯定会在我的词汇中添加这个短语.:-) (2认同)