C# 抽象类和流Nhibernate

C# 抽象类和流Nhibernate,c#,oop,inheritance,interface,fluent-nhibernate,C#,Oop,Inheritance,Interface,Fluent Nhibernate,我的域名有一个叫做汽车的对象。它有几个属性 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(); } 它实现了接口ICa

我的域名有一个叫做汽车的对象。它有几个属性

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

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

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

public string DoDrive(ICar c)
    {
        return c.Drive();
    }
但现在我希望我的Car对象使用fluentnhibernate持久化到数据库中。 我只想要一辆餐车,卡车和跑车都在同一张桌子上。我可以创建一个枚举来标识它是跑车还是卡车。那不是一个人。但我如何映射我的汽车对象

我不能为nhibernate使用抽象类


谢谢

如果您希望所有汽车都保存在同一个表中,则需要实现一种称为的映射策略

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

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");
    }
}
公共类CarMap:ClassMap
{
公共CarMap()
{
Id(x=>x.Id);
Map(x=>x.Color);
Map(x=>x.Model);
Map(x=>x.Name);
区分子类子列(“类型”);
}
}
该表将有一个“类型”列。这称为鉴别器列

然后映射所有具体的类。每个混凝土等级将有一个“鉴别器值”:

公共类SportCarMap:子类映射
{
公共体育CARMAP()
{
鉴别器值(“跑车”);
//如果您的跑车具有特定的性能:
//Map(x=>x.制动马力);
}
}
公共类TruckMap:子类映射
{
公共卡车通行证()
{
鉴别器值(“卡车”);
//如果您的卡车具有特定属性:
//Map(x=>x.MaxLoad);
}
}

如果您希望所有汽车都保存在同一张表中,则需要实施一种称为的映射策略

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

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");
    }
}
公共类CarMap:ClassMap
{
公共CarMap()
{
Id(x=>x.Id);
Map(x=>x.Color);
Map(x=>x.Model);
Map(x=>x.Name);
区分子类子列(“类型”);
}
}
该表将有一个“类型”列。这称为鉴别器列

然后映射所有具体的类。每个混凝土等级将有一个“鉴别器值”:

公共类SportCarMap:子类映射
{
公共体育CARMAP()
{
鉴别器值(“跑车”);
//如果您的跑车具有特定的性能:
//Map(x=>x.制动马力);
}
}
公共类TruckMap:子类映射
{
公共卡车通行证()
{
鉴别器值(“卡车”);
//如果您的卡车具有特定属性:
//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);
    }
}
公共类SportCarMap:子类映射
{
公共体育CARMAP()
{
鉴别器值(“跑车”);
//如果您的跑车具有特定的性能:
//Map(x=>x.制动马力);
}
}

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

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

        //If your Sport Car has specific properties:
        //Map(x => x.BrakeHorsePower);
    }
}
公共类SportCarMap:子类映射
{
公共体育CARMAP()
{
鉴别器值(“跑车”);
//如果您的跑车具有特定的性能:
//Map(x=>x.制动马力);
}
}

回答得很好,谢谢。我没有意识到这个概念的存在。很好的回答,谢谢。我甚至没有意识到这个概念的存在。