2016-10-24 54 views
0

我使用NHibernate和FluenNHibernate。NHibernate 4.0打破派生類映射

我有2類Deal和SpecialDeal。 表「SpecialDeal」不包含卷列。我真的存儲和使用SpecialDealMap中顯示的只有4個屬性。在我將NHibernate更新到4.0版本之前,這是可以的。現在查詢失敗,因爲他們試圖從「SpecialDeal」表中獲得音量,儘管音量在SpecialDealMap中不存在,並且它確實不在「SpecialDeal」表中。

我該如何解決?

public class Deal 
{ 
    public long Id { get; set; } 
    public DateTime Time { get; set; } 
    public decimal Price { get; set; } 
    public decimal Volume { get; set; } 

    public Deal() {} 
} 

public class SpecialDeal: Deal 
{ 
    public string Code { get; set; } 
} 

public class SpecialDealMap: ClassMap<SpecialDeal> 
{ 
    Id(x => x.Id); 
    Map(x => x.Time); 
    Map(x => x.Price); 
    Map(x => x.Code); 
} 

回答

0

你將不得不重構你的代碼。如果交易量不是特殊交易的一部分,那麼這實際上不是一種正義關係。

我建議一類佈局像

public class Deal 
{ 
    public long Id { get; set; } 
    public DateTime Time { get; set; } 
    public decimal Price { get; set; } 
} 

public class VolumeDeal : Deal 
{ 
    public decimal Volume { get; set; } 
} 

public class SpecialDeal : Deal 
{ 
    public string Code { get; set; } 
} 

您是否想使一個表每個層次結構或表每個子類,你也去確定。您當前沒有使用Nhibernate的任何繼承映射,因爲您的子類不使用SubclassMap進行映射。它使用ClassMap。

+0

我同意你的意見。但SpecialDeal真的處理一些額外的屬性。在「SpecialDeal」表中添加多餘的列是很方便的,因爲它按預期工作。你知道NHibernate內部發生了什麼變化嗎? – stray

+0

我不知道在NHibernate中發生的變化,但你原來的映射不被識別爲一個子類,因爲你是從你的SpecialDealMap中的SubclassMap繼承。你有沒有試過改變它? – Fran

+0

我認爲你是對的,我應該重構這段代碼。 – stray