映射抽象类和子类时NHibernate DuplicateMappingException

时间:2010-06-15 08:05:04

标签: nhibernate fluent-nhibernate nhibernate-mapping abstract-class

我有一个抽象类,以及它的子类,我想使用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

有什么想法吗?

2 个答案:

答案 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可以为同一个类生成两个映射。