抽象类和Fluent Nhibernate

Cru*_*ler 1 c# oop inheritance interface fluent-nhibernate

我的域名有一个名为Car的对象.它有几个属性

public abstract class Car : ICar
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Model { get; set; }
    public string Color { get; set; }
    public abstract string Drive();
}
Run Code Online (Sandbox Code Playgroud)

它实现了接口ICar

public interface ICar
{
    string Color { get; set; }
    int Id { get; set; }
    string Model { get; set; }
    string Name { get; set; }
    string Drive();
}
Run Code Online (Sandbox Code Playgroud)

现在我希望有两种继承类型.他们继承了Car,并实施了ICar.

class SportCar: Car, ICar
{
    public override string Drive()
    {
        return ("vroooomvroooomvroooomvroooom i'm a sports car - "+ Name);
    }
 }
Run Code Online (Sandbox Code Playgroud)

class Truck: Car, ICar
{
    public override string Drive()
    {
        return ("grrrrrrrrrrrr i'm a sports truck- " + Name);
    }
}
Run Code Online (Sandbox Code Playgroud)

所以现在我有两辆满载合同的车辆,并且有不同的驾驶方式.

这很好用,所以在我的应用程序的其他地方,我可以有这样的方法,我们很高兴

public string DoDrive(ICar c)
    {
        return c.Drive();
    }
Run Code Online (Sandbox Code Playgroud)

但是现在我想让我的Car对象使用流畅的nhibernate持久化到数据库.我只想要一张桌子车,卡车和跑车在同一张桌子上.我可以创建一个枚举来识别它是运动车还是卡车.那不是一个问题.但是如何映射我的汽车对象.

我不能使用nhibernate的抽象类

谢谢!

Red*_*eda 8

如果您希望将所有汽车保留在同一个表中,则需要实现一个名为table的每个类层次结构的映射策略.

首先,将您的抽象类映射如下:

public class CarMap : ClassMap<Car>
{
    public CarMap()
    {
        Id(x => x.Id);
        Map(x => x.Color);
        Map(x => x.Model);
        Map(x => x.Name);
        DiscriminateSubClassesOnColumn("Type");
    }
}
Run Code Online (Sandbox Code Playgroud)

该表将具有"类型"列.这称为鉴别器列.

然后映射所有具体类.每个具体类都有一个"鉴别器值":

public class SportCarMap : SubclassMap<Car>
{
    public SportCarMap()
    {
        DiscriminatorValue("SportCar");

        //If your Sport Car has specific properties:
        //Map(x => x.BrakeHorsePower);
    }
}

public class TruckMap : SubclassMap<Car>
{
    public TruckMap()
    {
        DiscriminatorValue("Truck");

        //If your Truck has specific properties:
        //Map(x => x.MaxLoad);
    }
}
Run Code Online (Sandbox Code Playgroud)