09juil. 2013

NHibernate : Object with id: XXX was not of the specified subclass

J'ai récemment eu un problème de mapping avec NHibernate. L'idée était de mapper avec les attributs NHibernate une collection d'objet qui hérite d'une classe abstraite en utilisant un table-per-class-hierarchy.

Un discriminateur est déclaré dans le mapping de la classe abstraite - celui ci est ensuite valué dans les classes filles. Cependant, lors de la récupération de données, j'obtenais une erreur du type :

Object with id: XXX was not of the specified subclass

En clair, Nhibernate, lors de la récupération des données recevait un type concret qui ne correspondait pas à ce qui était mappé.

La raison était que le discriminateur n'était pas utilisé dans la requête générée par NHibernate. Cela se voit d'ailleurs au niveau de la requête SQL si les logs NHibernate sont activés.

Pour corriger ce comportement, il suffit d'ajouter Force = true dans l'attribut discriminator. Exemple :

[Class(Name = "Model.Objects.AbstractRoot, Model",
Table = "MyRootTable", 
Polymorphism = PolymorphismType.Explicit,
Lazy = false, 
Abstract = true)]
[Discriminator(1, Column = "metadataType", 
Type = "System.String", NotNull = true, 
Force = true)]
public abstract class AbstractRootObject
{
    ...
}

aucun commentaire

Fil des commentaires de ce billet

Ajouter un commentaire

Le code HTML est affiché comme du texte et les adresses web sont automatiquement transformées.