2013-08-06 68 views
1

我的域名有一个对象称为汽车。它有几个特性抽象类和流利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(); 
} 

它实现了接口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); 
    } 
} 

所以,现在我有fullfill合同,并有驾驶不同的方式两辆车。

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

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

但现在我想我的车对象使用被保存到数据库流利nhibernate。 我只想要一张桌子的汽车,而卡车和跑车应该放在同一张桌子上。我可以创建一个枚举来确定它是否是赛车或卡车。那不是一个问题。但如何映射我的汽车物体。

我不能使用抽象类nhibernate

谢谢!

回答

7

如果您希望所有车辆都保存在同一张表中,则需要实施名为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); 
    } 
} 
+0

伟大的答案谢谢。没有意识到这个概念甚至存在。 – Crudler