J'ai un problème avec CustomType dans Fluent NHibernate. Je dois enregistrer en JSON un dictionnaire dans ma base de données. J'ai créé un customType pour cela qui implémente l'interface IUserType. Il n'y a aucun problème pour enregistrer le dictionnaire dans la base de données pour la première fois, mais lorsque j'essaie de mettre à jour la collection, nHibernate ne définit pas une propriété comme sale et ne la met pas à jour.Dictionnaire fluide nHibernate customType
Mes méthodes equals et 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();
}
Les objets passés à Equals, méthode sont toujours les mêmes (récemment modifié) deux objets. Quelqu'un at-il une idée de ce que je fais de mal?
Reste du IUserType Code de mise en œuvre:
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; }
}
Vous voulez dire que votre implémentation 'IUserType.Equals' obtient toujours la même référence d'objet pour' x' et 'y'? Et que retournez-vous pour 'IsMutable'? –
Votre implémentation 'Replace' entraînerait des problèmes si vous travaillez avec des entités détachées. Il devrait copier 'original' à' target' pour supporter 'Merge'. Vos implémentations 'Assemble' et' Disassemble' causeront des problèmes si vous utilisez un cache de second niveau. Ils devraient au moins produire des copies profondes, mais peut-être serait-il préférable de mettre en cache (désassembler) la sérialisation JSon à la place et de la désérialiser lors de l'assemblage. Voir les commentaires ['IUserType'] (https://github.com/nhibernate/nhibernate-core/blob/master/src/NHibernate/UserTypes/IUserType.cs). –