2

私のドメインには 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();
}

ここで、2 つの継承された型が必要です。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);
    }
}

だから今、私は契約を履行し、異なる運転方法を持っている2台の車を持っています.

いいね

これはうまく機能するので、アプリの他の場所でこのようなメソッドを使用でき、満足しています

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

しかし、流暢な nhibernate を使用して Car オブジェクトをデータベースに永続化する必要があります。テーブル Car を 1 つだけにして、トラックとスポーツカーを同じテーブルに配置します。スポーツカーかトラックかを識別する列挙型を作成できます。それは問題ではありません。しかし、車のオブジェクトをマッピングする方法。

nhibernate に抽象クラスを使用できません

ありがとう!

4

2 に答える 2

9

すべての車を同じテーブルに保持したい場合は、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);
    }
}
于 2013-08-06T20:30:48.407 に答える