NHibernate DuplicateMappingException при отображении абстрактного класса и подкласса

У меня есть абстрактный класс и подклассы этого, и я хочу отобразить это на свою базу данных с помощью NHibernate. Я использую Быстрый и как сделать отображение. Но когда я добавляю отображение подкласса 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
{
    public FieldValueMapping()
    {
        Id(m => m.Id).GeneratedBy.HiLo("1");
        // DiscriminateSubClassesOnColumn("type"); 
    }
}

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

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

> NHibernate.MappingException : Could not compile the mapping document: (XmlDocument)
  ----> NHibernate.DuplicateMappingException : Duplicate class/entity mapping NamespacePath.StringFieldValue

Какие-либо идеи?

6
задан accdias 5 December 2019 в 19:27
поделиться

2 ответа

Проблема обнаружена. Оказалось, что я несколько раз ссылался на ту же сборку в 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 устраняет проблему.

8
ответ дан 10 December 2019 в 00:33
поделиться

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

2
ответ дан 10 December 2019 в 00:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: