2013-08-06 119 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