Tod*_*odd 2 .net nhibernate fluent-nhibernate
我有一个相当简单的类,我想通过NHibernate(w/Fluent映射)保存到SQL Server.该类主要由可选的字符串字段组成.
我的问题是我将类字段默认为string.empty以避免NullRefExceptions,当NHibernate将行保存到数据库时,每列包含一个空字符串而不是null.
问题:当string属性为空字符串时,有没有办法让NHibernate自动保存null?或者我需要使用if(string.empty)检查来丢弃我的代码吗?
您可以使用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)
NHibernate正在做你要求它做的事情.一方面,你说你试图避免NullReferenceException,另一方面NULL,当一个值不为空时,你试图保存在数据库中.这听起来像是一个矛盾.而不是尝试解决此功能错误,尝试允许空值(并检查数据以防止NRE)或不允许空值.
如果您想要使用NULL字段和空字段覆盖特殊情况,请考虑读取正确的数据(并且不要初始化String.Empty).如果将空字符串视为等于该数据库中的空值,则只需将所有字段初始化为空字符串,以使其保持简单和一致.
| 归档时间: |
|
| 查看次数: |
3534 次 |
| 最近记录: |