5

Mam klasę abstrakcyjną i jej podklasy i chcę ją zmapować do mojej bazy danych przy użyciu NHibernate. Używam Fluent i read on the wiki, jak wykonać mapowanie. Ale kiedy dodaję mapowanie podklasy, generowany jest wyjątek NHibernate.DuplicateMappingException podczas mapowania. Czemu?Wyjątek NHibernate DuplicateMappingException podczas odwzorowywania klasy abstrakcyjnej i podklasy klasy abstrakcyjnej

Oto moje (uproszczone) zajęcia:

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

a mapowania:

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); 
    } 
} 

i wyjątek:

NHibernate.MappingException: Nie można skompilować dokument mapowania : (XmlDocument) ----> NHibernate.DuplicateMappingException: Powielanie mapowania klasy/jednostki Na mespacePath.StringFieldValue

Jakieś pomysły?

Odpowiedz

7

Odkryto problem. Okazało się, że zrobiłem odwołać tego samego zespołu kilkakrotnie w PersistenceModel służy do konfigurowania bazy danych:

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

Najwyraźniej nie jest to problem dla ClassMap-odwzorowań. Ale w przypadku SubclassMap nie obsługuje go również, co powoduje duplikowanie mapowań - a zatem wyjątek DuplicateMappingException. Usunięcie duplikatów w PersistenceModel rozwiązuje problem.

2

Jeśli używasz automappowań wraz z jawnymi mapowaniami, wtedy płynnie wygeneruje dwa mapowania dla tej samej klasy.

+0

Tak - używam tylko jawnych mapowań, ale myśl przyszła mi do głowy .. Muszę sprawdzić, czy to z jakiegoś powodu automatycznie zmapowało podklasę. Czy to prawda? – stiank81

+0

Po raz pierwszy używam SubclassMap. ClassMap nie są zautomatyzowane, ale czy może to być SubclassMaps? Nie mam tak dużego doświadczenia z Fluent .. – stiank81

+0

http://stackoverflow.com/questions/1538248/fluent-nhibernate-mapping-a-class-with-subclass-problem/1538419#1538419 możesz obejrzeć tutaj na przykład – Sly

Powiązane problemy