У меня есть абстрактный класс и подклассы этого, и я хочу отобразить это на свою базу данных с помощью 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
Какие-либо идеи?
Проблема обнаружена. Оказалось, что я несколько раз ссылался на ту же сборку в 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 устраняет проблему.
Если вы используете автоматические сопоставления вместе с явными сопоставлениями, fluent может сгенерировать два сопоставления для одного и того же класса.