我有一个抽象类,以及它的子类,我想使用NHibernate将它映射到我的数据库。我正在使用Fluent,read on the wiki如何进行映射。但是当我添加子类的映射时,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) ----&GT; NHibernate.DuplicateMappingException:重复的类/实体映射NamespacePath.StringFieldValue
有什么想法吗?
答案 0 :(得分:7)
发现了这个问题。事实证明,我确实在用于配置数据库的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中的重复项可以解决问题。
答案 1 :(得分:2)
如果您将自动化与显式映射一起使用,那么Fluent可以为同一个类生成两个映射。