2012-03-02 230 views
0

我是新來的(流利)NHibernate和有一個問題:Fluenthibernate映射繼承/子類

我下面的類結構:

<!-- language: c# --> 
public class JAccount 
{ 
    public virtual long Id { get; private set; } 
    //some properties 
    public virtual JProfile Profile { get; set; } 
} 
public class JProfile 
{ 
    public virtual long Id { get; set; } 
    //some more properties 
    public virtual int Age { get; set; } 

} 

我映射後就正常了這些類..

<!-- language: c# --> 
public class JProfileMap : ClassMap<JProfile> 
{ 
    public JProfileMap() 
    { 
     Id(x => x.Id).Unique().GeneratedBy.Assigned(); 
     //some more property mappings 

    } 
} 

然後我想,我在這些實體類中有很多邏輯(方法),我想爲它們中的每一個都創建一個新的類,並從基類繼承並將所有邏輯存儲到它中。 所以,我不喜歡的東西:

<!-- language: c# --> 
public class TestAccount : JAccount 
{ 
    //all properties which did not need to be mapped into the DB 
    //as well as methods 
} 
//did the same for JProfile 

問題是現在,當我加載從數據庫中的一個JAccount和我丟在TestAccount 並試圖挽救回來,我因爲FluentHibernate沒有得到一個異常映射爲TestAcccount

我的問題是現在:我真的需要SubClassMap這個新類嗎?我不想/需要將它們映射到數據庫中,因爲他們所做的只是從其基類中取出logik。是否有不同的方式來完成這個?

感謝所有幫助

+0

它是不可能有實例化一個'JAccount'並轉換爲'TestAccount'。你能澄清你在這裏做什麼嗎? – Jay 2012-03-02 01:42:22

+0

就像我說過的,我想保留映射的基類儘可能簡單。有JUST屬性,另一個類從這個基類繼承,實現所有其他的東西像方法..所以我有'TestAccount'類繼承自'JAccount'與方法像'Register()',但這些類沒有映射,因爲他們沒有需要存儲在數據庫中的屬性/信息,它們只用方法擴展基類......但是當我嘗試更新/保存並且實例化這些類時,我從Fluenthibernate中得到錯誤:( – Thomas 2012-03-02 03:26:43

+0

你可以以相反的方式做到這一點,告訴nhibernate忽略基類例如'Profile:Entity'告訴nhibernate忽略'Entity',但是有沒有辦法去做oposite,忽略profile和save/cast到實體? = D – Thomas 2012-03-02 03:34:07

回答

0

對象的類型是應存儲在數據庫中的重要信息。這是爲什麼有一個SubclassMapping的最重要的原因。相反,繼承JAccount的

您可以使用策略模式,以單獨的邏輯

public class JAccount 
{ 
    private AcountType _type; 

    public JAccount(AcountType type) 
    { 
     _type = type; 
    } 

    public virtual long Id { get; private set; } 
    //some properties 
    public virtual JProfile Profile { get; set; } 

    public void Register() 
    { 
     _type.Register(this); 
    } 
} 

// in JAccountMap 
    References(Reveal.Member<JAccount>("_type")).Access.Field().Not.LazyLoad(); 
    // or 
    Map(Reveal.Member<JAccount>("_type"), "type").CustomType<AccountTypeToStringUserType>(); 
+0

是的,在大多數情況下,這是真的,但我想要的是有一個表示該表(只是屬性),並映射的類,和第二類,其中包含所有的邏輯材料,但不是mappe d到數據庫..但是我想我的嘗試我想要做的是錯誤/邏輯錯誤... – Thomas 2012-03-05 23:17:37

+0

如果有多個繼承類,你怎麼知道哪一個應用於映射類?如果它是數據庫中的一列,那麼只需映射層次結構並完成即可 – Firo 2012-03-06 08:16:38