流利的 nHibernate 字典 customType
Fluent nHibernate dictionary customType
我在 Fluent NHibernate 中遇到 CustomType 问题。
我必须将字典另存为 Json 到我的数据库中。
我为此创建了一个实现 IUserType 接口的 customType。
第一次将字典保存到数据库没有问题,但是当我尝试更新集合时,nHibernate 不将 属性 设置为脏并且不更新它。
我的 Equals 和 GetHashCode 方法
public new bool Equals(object x, object y)
{
if (x == null && y == null)
return true;
if (x == null || y == null)
return false;
if (!(x is IDictionary<K, Z>) || !(y is IDictionary<K, Z>))
return false;
var dic1 = (x as IDictionary<K, Z>).OrderBy(z=> z.Key);
var dic2 = (y as IDictionary<K, Z>).OrderBy(z => z.Key);
return dic1.SequenceEqual(dic2);
}
public int GetHashCode(object x)
{
if (x == null)
return 0;
return x.GetHashCode();
}
传递给 equals 方法的对象总是相同的(最近修改过的)两个对象。
有人知道我做错了什么吗?
其余 IUserType 实现代码:
public object NullSafeGet(IDataReader rs, string[] names, object owner)
{
if (names.Length != 1)
throw new InvalidOperationException("Only expecting one column...");
var val = rs[names[0]] as string;
if (val != null && !string.IsNullOrWhiteSpace(val))
{
return JsonConvert.DeserializeObject<T>(val, JSonSerializableTypeSerializer.Settings);
}
return null;
}
public void NullSafeSet(IDbCommand cmd, object value, int index)
{
var parameter = (DbParameter)cmd.Parameters[index];
if (value == null)
{
parameter.Value = DBNull.Value;
}
else
{
parameter.Value = JsonConvert.SerializeObject(value, JSonSerializableTypeSerializer.Settings);
}
}
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 cached;
}
public object Disassemble(object value)
{
return value;
}
public SqlType[] SqlTypes
{
get
{
return new SqlType[] { new StringClobSqlType() };
}
}
public Type ReturnedType
{
get { return typeof(T); }
}
public bool IsMutable
{
get { return true; }
}
也许我错了,但我猜你在实施 IUserType.IsMutable
.
时 returned false
因为你的用户类型 return 是一个 Dictionary
,这是一个可变类型,而且你确实改变了它,你的用户类型必须 return true
因为它IsMutable
属性.
我在 Fluent NHibernate 中遇到 CustomType 问题。 我必须将字典另存为 Json 到我的数据库中。 我为此创建了一个实现 IUserType 接口的 customType。 第一次将字典保存到数据库没有问题,但是当我尝试更新集合时,nHibernate 不将 属性 设置为脏并且不更新它。
我的 Equals 和 GetHashCode 方法
public new bool Equals(object x, object y)
{
if (x == null && y == null)
return true;
if (x == null || y == null)
return false;
if (!(x is IDictionary<K, Z>) || !(y is IDictionary<K, Z>))
return false;
var dic1 = (x as IDictionary<K, Z>).OrderBy(z=> z.Key);
var dic2 = (y as IDictionary<K, Z>).OrderBy(z => z.Key);
return dic1.SequenceEqual(dic2);
}
public int GetHashCode(object x)
{
if (x == null)
return 0;
return x.GetHashCode();
}
传递给 equals 方法的对象总是相同的(最近修改过的)两个对象。 有人知道我做错了什么吗?
其余 IUserType 实现代码:
public object NullSafeGet(IDataReader rs, string[] names, object owner)
{
if (names.Length != 1)
throw new InvalidOperationException("Only expecting one column...");
var val = rs[names[0]] as string;
if (val != null && !string.IsNullOrWhiteSpace(val))
{
return JsonConvert.DeserializeObject<T>(val, JSonSerializableTypeSerializer.Settings);
}
return null;
}
public void NullSafeSet(IDbCommand cmd, object value, int index)
{
var parameter = (DbParameter)cmd.Parameters[index];
if (value == null)
{
parameter.Value = DBNull.Value;
}
else
{
parameter.Value = JsonConvert.SerializeObject(value, JSonSerializableTypeSerializer.Settings);
}
}
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 cached;
}
public object Disassemble(object value)
{
return value;
}
public SqlType[] SqlTypes
{
get
{
return new SqlType[] { new StringClobSqlType() };
}
}
public Type ReturnedType
{
get { return typeof(T); }
}
public bool IsMutable
{
get { return true; }
}
也许我错了,但我猜你在实施 IUserType.IsMutable
.
false
因为你的用户类型 return 是一个 Dictionary
,这是一个可变类型,而且你确实改变了它,你的用户类型必须 return true
因为它IsMutable
属性.