抽象类和Fluent Nhibernate

本文关键字:Nhibernate Fluent 抽象类 | 更新日期: 2023-09-27 18:26:47

我的域有一个名为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();
}

它实现了ICar 接口

public interface ICar
{
    string Color { get; set; }
    int Id { get; set; }
    string Model { get; set; }
    string Name { get; set; }
    string Drive();
}

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

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

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

所以现在我有两辆完全符合合同的车,并且有了不同的驾驶方式。

冷却

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

public string DoDrive(ICar c)
    {
        return c.Drive();
    }

但现在我希望我的Car对象使用fluent nhibernate持久化到数据库中。我只想要一张桌子——汽车、卡车和跑车在同一张桌子上。我可以创建一个枚举来识别它是跑车还是卡车。这不是问题。但是如何绘制我的汽车对象。

我不能为nhibernate 使用抽象类

谢谢!

抽象类和Fluent Nhibernate

如果您希望所有的汽车都被持久化在同一个表中,那么您需要实现一个名为table-per-class层次结构的映射策略。

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

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");
    }
}

该表将有一个"类型"列。这被称为鉴别器列。

然后绘制你所有的具体类。每个具体类别都有一个"鉴别器值":

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);
    }
}

Reda是对的,但在子类映射中,u应该引用子类。例如:

public class SportCarMap : SubclassMap<SportCar>
{
    public SportCarMap()
    {
        DiscriminatorValue("SportCar");
        //If your Sport Car has specific properties:
        //Map(x => x.BrakeHorsePower);
    }
}