Nhibernate 如何将继承与返回的属性映射到其他继承?

Nhibernate 如何将继承与返回的属性映射到其他继承?,nhibernate,inheritance,mapping,table-per-hierarchy,Nhibernate,Inheritance,Mapping,Table Per Hierarchy,我有一个抽象类Vehicle和两个派生自Vehicle的类:Car和叉车 public abstract class Vehicle { public EngineBase Engine { get; set; } } public class Car : Vehicle { public GasEngine Engine { get; set; } } public class ForkLift : Vehicle { public ElectricEngine

我有一个抽象类Vehicle和两个派生自Vehicle的类:Car和叉车

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; }
}
和发动机类别:

public abstract class EngineBase
{
}

public class GasEngine : EngineBase
{
}

public class ElectricEngine : EngineBase
{
}
引擎映射为每个类层次结构的表。对于车辆,我希望使用相同的模式

如何使用该引擎属性映射引擎类和派生类


如何使用延迟加载进行此操作?

该代码无法编译,这使得您不可能对其进行映射。

使用车辆中的受保护字段,并使用访问策略对其进行映射:

public abstract class Vehicle
{
    protected Engine _engine;
}
在Fluent NHibernate中,这将映射为:

References(x => x.Engine, "EngineId").Access.CamelCaseField(Prefix.Underscore);
然后,扩展Vehicle的类可以根据需要对其进行强制转换:

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

我知道并没有新的修改器,但假设这是伪代码。若你们有一个新的修改器,那个么这些属性将是完全不相关的,这使得并没有必要在车辆中添加EngineBase。这是真的,但引擎有一些共同的属性,我可以在列表中显示所有车辆的。如何改变类来实现这一点?好的,但我不能使用延迟加载。你不能将engineProxy转换为汽油机等:你确定吗?你应该得到一个可以被转换的具体类型的代理。我也有同样的问题。我得到的代理实体只是基类的代理,不能强制转换为派生类。这对我来说毫无意义,但这是真的。这似乎完全违背了NHibernate应该为你做的事情。我必须使用非惰性映射才能让它工作。