2015-12-14 217 views
5

域名:功能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://stackoverflow.com/a/6227248/1225337 –

+0

是的,我做到了。類型映射不是這裏的問題。我沒有映射基類的類型,但只有我希望有一個表的具體子類型。您指向的鏈接不解決這種繼承問題。 –

回答

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(); 
    } 
}