【问题标题】:Abstract classes and Fluent Nhibernate抽象类和 Fluent Nhibernate
【发布时间】:2013-08-06 20:02:24
【问题描述】:

我的域有一个名为 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 使用抽象类

谢谢!

【问题讨论】:

    标签: c# oop inheritance interface fluent-nhibernate


    【解决方案1】:

    如果您希望所有的汽车都保存在同一个表中,您需要实现一个名为table per class hierarchy 的映射策略。

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

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

    【讨论】:

    • 很好的答案,谢谢。没有意识到这个概念甚至存在。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-24
      相关资源
      最近更新 更多