2010-06-09 132 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