Fluent NHibernate의 CustomType에 문제가 있습니다. Json으로 데이터베이스에 사전을 저장해야합니다. IUserType 인터페이스를 구현하는 this에 대한 customType을 만들었습니다. 처음으로 사전을 데이터베이스에 저장하는 데는 문제가 없지만 컬렉션을 업데이트하려고하면 nHibernate가 속성을 더티로 설정하지 말고 업데이트하지 마십시오.Fluent nHibernate dictionary customType
내 같음과를 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.Equals' 구현물은 항상'x'와'y'에 대해 같은 객체 참조를 얻습니다. 그리고'IsMutable'에 대한 귀하의 귀환은 무엇입니까? –
분리 된 엔티티로 작업 할 경우 '대체'구현으로 인해 문제가 발생합니다. Merge를 지원하기 위해서는'target '에'original'을 복사해야합니다. 2 차 캐쉬를 사용하면'Assemble'과'Disassemble' 구현이 문제를 일으킬 것입니다. 그들은 최소한 깊은 복사본을 만들어야하지만 JSon 직렬화를 캐시 (디스어셈블링)하고 어셈블 할 때 직렬화를 해제하는 것이 더 나을지도 모릅니다. ['IUserType' comments] (https://github.com/nhibernate/nhibernate-core/blob/master/src/NHibernate/UserTypes/IUserType.cs)를보십시오. –