NHibernate DuplicateMappingException при отображении абстрактного класса и подкласса - PullRequest
5 голосов
/ 15 июня 2010

У меня есть абстрактный класс и его подклассы, и я хочу сопоставить это с моей базой данных, используя NHibernate. Я использую Fluent, и прочитал на вики , как сделать отображение. Но когда я добавляю сопоставление подкласса, возникает исключение NHibernate.DuplicateMappingException, когда оно сопоставляется. Зачем?

Вот мои (упрощенные) классы:

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

И сопоставления:

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

И исключение:

NHibernate.MappingException: не удалось скомпилировать документ сопоставления: (XmlDocument) ----> NHibernate.DuplicateMappingException: дублирование сопоставления класса / сущности NamespacePath.StringFieldValue

Есть идеи?

Ответы [ 2 ]

7 голосов
/ 16 июня 2010

Обнаружена проблема. Оказалось, что я несколько раз ссылался на одну и ту же сборку в модели PersistenceModel, используемой для настройки базы данных:

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

Видимо, это не проблема для отображений ClassMap. Но для SubclassMap это также не обрабатывается, вызывая дублирование отображений - и, следовательно, исключение DuplicateMappingException. Удаление дубликатов в PersistenceModel устраняет проблему.

2 голосов
/ 15 июня 2010

Если вы используете autoppings вместе с явными отображениями, тогда fluent может сгенерировать два отображения для одного и того же класса.

...