2010-06-09 171 views
0

我有抽象類Vehicle和派生自Car和ForkLift的兩個類。如何映射繼承與屬性返回其他繼承?

public abstract class Vehicle 
{ 
    public EngineBase Engine { get; set; } 
} 

public class Car : Vehicle 
{ 
    public GasEngine Engine { get; set; } 
} 

public class ForkLift : Vehicle 
{ 
    public ElectricEngine Engine { get; set; } 
} 

和發動機clasess:

public abstract class EngineBase 
{ 
} 

public class GasEngine : EngineBase 
{ 
} 

public class ElectricEngine : EngineBase 
{ 
} 

引擎映射以 「每類層次表」。與車輛我想使用相同的模式。

如何映射引擎類並使用該引擎屬性派生?

如何做到這一點與延遲加載?

回答

0

該代碼不能編譯,這使得您不可能映射它。

+0

我知道沒有「新」修飾符,但假設這是僞代碼。 – dariol 2010-06-09 21:22:51

+0

如果您有一個'new'修飾符,那些屬性將完全不相關,這就無需在Vehicle中添加EngineBase。 – 2010-06-09 23:37:06

+0

這是真的,但引擎具有共同的屬性,我可以列出所有車輛的列表。如何改變類來實現? – dariol 2010-06-10 11:04:30

0

使用受保護的領域在汽車和與接入的策略映射它:

public abstract class Vehicle 
{ 
    protected Engine _engine; 
} 

用流利的NHibernate的,這將被映射:

References(x => x.Engine, "EngineId").Access.CamelCaseField(Prefix.Underscore); 

然後擴展車輛可強制轉換爲類需要:

public class Car : Vehicle 
{ 
    public GasEngine 
    { 
     get { return (GasEngine)_engine; } 
     set { _engine = Value; } 
    } 
} 
+0

好的,但我不能使用延遲加載。你不能將_engineProxy強制轉換成GasEngine等等。:( – dariol 2010-06-10 14:39:54

+0

你確定嗎?你應該得到一個可以投射的具體類型的代理 – 2010-06-10 14:48:38

+0

我有同樣的問題。我回來的代理實體只是一個代理基類,不能轉換爲派生類,這對我沒有任何意義,但它是真實的,它似乎完全違背了NHibernate應該爲你做的事情,我必須使用非懶惰映射來讓它工作。 – 2011-06-28 13:03:08