5

Tengo una clase abstracta y subclases de esto, y quiero asignar esto a mi base de datos usando NHibernate. Estoy usando Fluent, y read on the wiki cómo hacer el mapeo. Pero cuando agrego el mapeo de la subclase, se lanza una NHibernate.DuplicateMappingException cuando está mapeando. ¿Por qué?NHibernate DuplicateMappingException al mapear la clase abstracta y la subclase

Éstos son mis clases (simplificado):

public abstract class FieldValue 
{ 
    public int Id { get; set; } 
    public abstract object Value { get; set; } 
} 

public class StringFieldValue : FieldValue 
{   
    public string ValueAsString { get; set; } 
    public override object Value 
    { 
     get 
     { 
      return ValueAsString; 
     } 
     set 
     { 
      ValueAsString = (string)value; 
     } 
    } 
} 

Y las asignaciones:

public class FieldValueMapping : ClassMap<FieldValue> 
{ 
    public FieldValueMapping() 
    { 
     Id(m => m.Id).GeneratedBy.HiLo("1"); 
     // DiscriminateSubClassesOnColumn("type"); 
    } 
} 

public class StringValueMapping : SubclassMap<StringFieldValue> 
{ 
    public StringValueMapping() 
    { 
     Map(m => m.ValueAsString).Length(100); 
    } 
} 

y la excepción:

NHibernate.MappingException: No se pudo compilar el documento de mapeo : (XmlDocument) ----> NHibernate.DuplicateMappingException: asignación de clase/entidad duplicada Na mespacePath.StringFieldValue

¿Alguna idea?

Respuesta

7

Descubierto el problema. Resultó que hice referencia a la misma Asamblea varias veces en el PersistenceModel utiliza para configurar la base de datos:

public class MappingsPersistenceModel : PersistenceModel 
{ 
    public MappingsPersistenceModel() 
    { 
     AddMappingsFromAssembly(typeof(FooMapping).Assembly); 
     AddMappingsFromAssembly(typeof(BarMapping).Assembly); 
     // Where FooMapping and BarMapping is in the same Assembly. 
    } 
} 

Al parecer, esto no es un problema para ClassMap-mappings. Pero para SubclassMap no lo maneja también, causando asignaciones duplicadas y, por lo tanto, DuplicateMappingException. Eliminar los duplicados en PersistenceModel soluciona el problema.

2

Si usa los autoelementos junto con las asignaciones explícitas, puede generar dos asignaciones para la misma clase.

+0

Sí, solo estoy usando mapeos explícitos, pero el pensamiento cruzó por mi mente ... Tengo que echar un vistazo para ver si por alguna razón mapeó automáticamente la subclase. ¿Verdad? – stiank81

+0

Esta es la primera vez que uso un SubclassMap. ClassMap no está automatizado, pero ¿podría ser que SubclassMaps son? No tengo mucha experiencia con Fluent .. – stiank81

+0

http://stackoverflow.com/questions/1538248/fluent-nhibernate-mapping-a-class-with-subclass-problem/1538419#1538419 Puedes mirar aquí para un ejemplo – Sly

Cuestiones relacionadas