2017-03-14 1 views
1

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; } 
    } 
+0

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'? –

+0

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). –

Répondre

1

Peut-être que je me trompe, mais je suppose que vous avez retourné false en mettant en œuvre IUserType.IsMutable.

Depuis votre type d'utilisateur retourne un Dictionary, qui est un type mutable, et que vous ne muter en effet, votre type d'utilisateur doit retourner true pour sa propriété IsMutable.

+0

Merci pour votre réponse. J'avais IsMutable défini faux, mais en le changeant en vrai n'a pas résolu mon problème. Dans la méthode Equals j'obtiens deux objets, et j'ai par exemple un dictionnaire en DB avec 2 éléments, je le supprime en code C# et je commet - Equals method fire et -> x obj est dictionnaire avec 0 element et y object est le même. – Ridikk12

+0

Ok. Je pense que ma métode en profondeur est mauvaise. – Ridikk12

+0

Le problème était dans l'implémentation isMutable et deep copy. – Ridikk12