映射抽象类和子类时出现NHibernate DuplicateMappingException异常

映射抽象类和子类时出现NHibernate DuplicateMappingException异常,nhibernate,fluent-nhibernate,nhibernate-mapping,abstract-class,Nhibernate,Fluent Nhibernate,Nhibernate Mapping,Abstract Class,我有一个抽象类和它的子类,我想用NHibernate将它映射到我的数据库。我正在使用和如何进行映射。但是,当我添加子类的映射时,映射时会抛出一个NHibernate.DuplicateMappingException。为什么? 以下是我的(简化)课程: public abstract class FieldValue { public int Id { get; set; } public abstract object Value { get; set; } } public

我有一个抽象类和它的子类,我想用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<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);
    }
}

有什么想法吗?

如果您将自动映射与显式映射一起使用,那么fluent可以为同一个类生成两个映射。

发现了问题。事实证明,我确实在用于配置数据库的PersistenceModel中多次引用了相同的程序集:

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

显然,对于类映射映射来说,这不是一个问题。但是对于子类映射,它也不能处理它,从而导致重复映射,从而导致DuplicateMappingException。删除PersistenceModel中的重复项修复了该问题

是的-我只使用显式映射,但我突然想到了。。我要看看它是否出于某种原因自动映射了子类。会吗?这是我第一次使用子类映射。类映射不是自动映射的,但子类映射是否会自动映射呢?我在流利方面没有那么多经验。。你可以看看这里的例子
public class MappingsPersistenceModel : PersistenceModel
{
    public MappingsPersistenceModel()
    {
        AddMappingsFromAssembly(typeof(FooMapping).Assembly);
        AddMappingsFromAssembly(typeof(BarMapping).Assembly);
        // Where FooMapping and BarMapping is in the same Assembly. 
    }
}