【问题标题】:NHibernate DuplicateMappingException when mapping abstract class and subclass映射抽象类和子类时出现NHibernate DuplicateMappingException
【发布时间】:2010-06-15 08:05:04
【问题描述】:

我有一个抽象类和它的子类,我想使用 NHibernate 将它映射到我的数据库。我正在使用Fluent 以及如何进行映射。但是当我添加子类的映射时,会在映射时抛出 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 : Could not compile the mapping document: (XmlDocument)
  ----> NHibernate.DuplicateMappingException : Duplicate class/entity mapping NamespacePath.StringFieldValue

有什么想法吗?

【问题讨论】:

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


    【解决方案1】:

    发现问题。原来我确实在用于配置数据库的 PersistenceModel 中多次引用了同一个 Assembly:

    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 中的重复项可以解决问题。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 是的 - 我只使用显式映射,但我的脑海中闪过这个想法。我得看看它是否出于某种原因自动映射了子类。会吗?
      • 这是我第一次使用 SubclassMap。 ClassMap 不是自动映射的,但 SubclassMap 是不是可以自动映射?我对 Fluent 没有太多经验..
      • stackoverflow.com/questions/1538248/…你可以看这里的例子
      猜你喜欢
      • 2011-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多