2

Fluent Nhibernate を使用して単純な継承階層を自動マップしようとしていますが、各テーブルにそのクラスとは少し異なる名前を付ける必要があります (Pascal ケースではなくアンダースコア)。これは、規則を使用する明らかな場所のようです。サブクラスごとのテーブル戦略も使用したいのですが、この組み合わせが問題を引き起こしているようです。規則は階層の基本クラスにのみ適用されます。

これが私の自動マッピングです:

AutoMap
    .AssemblyOf<BaseRule>()
    .IncludeBase<BaseRule>() // "BaseRule" is an abstract class
    .Conventions.Add( DefaultCascade.All() )
    .Conventions.Add<OracleTableNameConvention>()

クラスをマップする方法 (クラス名 -> テーブル名):

  abstract class BaseRule -> Base_Rule
  class NumberRule : BaseRule -> Number_Rule
  class PatternStringRule : BaseRule -> Pattern_String_Rule

私が実際に得ているもの:

  BaseRule -> Base_Rule
  NumberRule -> NumberRule
  PatternStringRule -> PatternStringRule

ご覧のとおり、実際に変更されているのは基底クラスだけです。これが私の既存の規則です。これは、私がそれをどのように定義しているかを確認できるようにするためです。

public class OracleTableNameConvention : IClassConvention
{
    public void Apply(IClassInstance instance)
    {
        string fixedName = instance.EntityType.Name.ToUnderscoredNaming();
        instance.Table(fixedName);
    }
}

インターフェイスも調べましたがISubclassConvention、そこにはテーブルの名前を調整する方法がありません(これは十分に理にかなっています。サブクラスは常に独自のテーブルにあるとは限りません)。

自動マッピングから行を削除するIncludeBaseと、名前は希望どおりになりますが、table-per-concrete-class になります。すべての共通データを 1 つの共有ベース テーブルに残して、 table-per- subclassを使用したいと考えています。

名前ごとにオーバーライドを追加できます。必要に応じて追加しますが、したくありません。

これは明らかにサポートされている動作であるように思われます。table-per-concrete-class に行かずに、階層内の各テーブルに命名規則を適用するにはどうすればよいですか?

4

1 に答える 1

4

この質問を投稿してすぐに、私はそれを理解しました。

IJoinedSubclassConvention私が実装する必要があったインターフェースです。

public class OracleSubClassConvention : IJoinedSubclassConvention
{
    public void Apply(IJoinedSubclassInstance instance)
    {
        string fixedName = instance.EntityType.Name.ToUnderscoredNaming();
        instance.Table(fixedName);
    }
}

method を持っているものを探して見つけましたTable(string)

于 2012-06-04T22:00:01.283 に答える