0

編集

いくつかのクラスのベースにしたいインターフェースがあります。BuildSchema(またはUpdateSchema)に移動すると、Nhibernateはインターフェイスのテーブルを作成します。私は次のような回避策を見つけたと思いました:

インターフェイスとクラス:

public interface ILevel
{
    int Id { get; set; }
    string Name { get; set; }
}
public abstract class Level : ILevel
{
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
}
public class LevelOne : Level { }
public class LevelTwo : Level { }

マッピング:

public class LevelMap : ClassMap<ILevel>
{
    public LevelMap()
    {
        Id(x => x.Id);
        Map(x => x.Name);
    }
}
public class LevelOneMap : SubclassMap<LevelOne>
{
}
public class LevelTwoMap : SubclassMap<LevelTwo>
{
}

これは機能しません(別のUpdateSchemaを実行すると、厄介なILevelテーブルが表示されました)。

インターフェイス/抽象クラスを完全に無視することに気付いていない構成はありますか?

4

1 に答える 1

2

両方とも Level/ILevel のプロパティを持つ別々のテーブル LevelOne と LevelTwo の場合、Level の汎用マッピングを使用します。

public abstract class LevelMap<T> : ClassMap<T>
    where T : Level  // ILevel should work, too
{
    protected LevelMap()
    {
        Id(x => x.Id);
        Map(x => x.Name);
    }
}

public class LevelOneMap : LevelMap<LevelOne>
{
}

public class LevelTwoMap : LevelMap<LevelTwo>
{
}

Fluent に実際のクラス階層を伝えずに、2 つの別個のクラス マッピングを提供します。

于 2012-07-30T15:10:54.290 に答える