代码之家  ›  专栏  ›  技术社区  ›  stiank81

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

  •  5
  • stiank81  · 技术社区  · 14 年前

    我有一个抽象类和它的子类,我想用NHibernate把它映射到我的数据库。我在用 Fluent

    以下是我的(简化)课程:

    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 : Could not compile the mapping document: (XmlDocument)
      ----> NHibernate.DuplicateMappingException : Duplicate class/entity mapping NamespacePath.StringFieldValue
    

    有什么想法吗?

    2 回复  |  直到 5 年前
        1
  •  8
  •   stiank81    14 年前

    发现了问题。事实证明,在用于配置数据库的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中的重复项可以解决这个问题。

        2
  •  2
  •   Sly    14 年前