功能NHibernate自动映射与覆盖:映射未映射的基类集合

问题描述:

域名:功能NHibernate自动映射与覆盖:映射未映射的基类集合

public class BaseClassClient 
{ 
    public virtual ICollection<BaseClass> BaseObjects{ get; set; } 
} 

public abstract class BaseClass 
{ 
} 

public class SubClass1 : BaseClass 
{ 
} 

public class SubClass2 : BaseClass 
{ 
} 

我得到的错误Association references unmapped class,即使两个子类映射。显然,基类本身没有被映射。请建议如何解决这个问题。

编辑

我宁愿,关闭了一个问题,重复到另一个之前,他们只是不读了,还在乎了解双方的问题。我看过Error: fluent NHibernate mapping which references mapping in different assembly这个问题。但它谈到了一个不同的场景。

我的场景如下所示。

public class Product 
{ 
    public int Id { get; set; } 
    public ICollection<BasePricingRule> PricingRules{ get; set; } 
} 

public abstract class BasePricingRule 
{ 
    public int Id { get; set; } 
    //other properties 
} 

//Several concrete classes inherit from BasePricingRule. 

我想每个具体类有一个表,没有基类表。因此,BasePricingRule没有映射。我允许类自动映射,偶尔提供必要的覆盖。我为产品类创建了一个自动映射覆盖,如下所示。

public void Override(FluentNHibernate.Automapping.AutoMapping<Product> mapping) 
    { 
     mapping.HasMany(product => product.PricingRules); //Not really sure 
                  // about how to map this. 
    } 

我一直在看到像http://ayende.com/blog/3941/nhibernate-mapping-inheritance这样的继承映射的例子。但这些例子实际上并没有解决我所面临的问题。不止这个错误,我想知道如何通过流利的NHibernate映射这个域,最好使用自动映射覆盖。

+0

请发表您的配置,你的流利测绘地图组件?检查这个帖子http://*.com/a/6227248/1225337 –

+0

是的,我做到了。类型映射不是这里的问题。我没有映射基类的类型,但只有我希望有一个表的具体子类型。您指向的链接不解决这种继承问题。 –

问题是,即使对于Table Per Concrete Class方法,您也必须映射基类。只是不是你可能会想到的方式。你应该在这个伟大的文章一起来看看:www.codeproject.com/Articles/232034/Inheritance-mapping-strategies-in-Fluent-Nhibernat

这将是或多或少是这样的:

public class BaseClassMap : ClassMap<BaseClass> { 
    public BaseClassMap() { 
     // indicates that this class is the base 
     // one for the TPC inheritance strategy and that 
     // the values of its properties should 
     // be united with the values of derived classes 
     UseUnionSubclassForInheritanceMapping(); 
    } 
} 

public class SubClass1Map : SubclassMap<SubClass1> { 
    public SubClass1Map() { 
     Table("SubClass1Table"); 
     Abstract(); 
    } 
} 

public class SubClass2Map : SubclassMap<SubClass2> { 
    public SubClass1Map() { 
     Table("SubClass2Table"); 
     Abstract(); 
    } 
}