1

これはバグのようですが、NHibernateバグトラッカーに送信する前に、これがどのように機能するかについての私の理解を確認したいと思います。

私のプロジェクトは、明示的なモデルマッピングを使用し、実行されるたびにデータベースを復元するように構成されています。プロパティを定義する単純な基本クラスがあります。サブクラスは、そのプロパティをそれ自体のプロパティと組み合わせて、次のように複合主キーを作成したいと考えています。

public class BaseClass
{
    public int InheritedId { get; set; }
}

public class Subclass : BaseClass
{
    public int OwnId { get; set; }
}

public class SubclassMap : ClassMapping<Subclass>
{
    public SubclassMap()
    {
        Table("Subclass");
        ComposedId(x => {
            x.Property(p => p.InheritedId);
            x.Property(p => p.OwnId);
        });
    }
}

期待される結果

私のデータベースにあるSubclassという名前のテーブルで、その中に2つの列があります:AliExpressIdOwnId、およびこれら2つの列で構成される主キー。

実結果

Subclassという名前のデータベース内のテーブルで、その中に2つの列があります:AttachedIdOwnId 、およびOwnIdだけで構成される主キー。

回避策

プロパティをサブクラスにコピーすると(としてマークを付けるnew)、上記は問題なく機能します。

仮説

NHibernateソースを見ると、このTypeExtensions.DecodeMemberAccessExpression()メソッドは、BaseClassをReflectedTypeとして指定するAttachedIdのMemberInfoを返し少し宣言れたモデルが最終的に解析されるときに、Subclassを反映タイプとして指定するMemberInfoを返すようです。この2つは異なるため、以前にコンパイルされたマッピング対象のComposedIdから見つけることができません。typeof(Subclass).GetProperties()ModelMapper.MapRootClass()

ヘルプ!

この問題に遭遇しましたか?私は何か変なことをしているのですか、それとも間違った振る舞いとしてNHibernateバグトラッカーに提出する必要がありますか?

4

1 に答える 1

1

正当なバグを発見したと思います。

生成されたマッピングは次のようになります。

<class name="Subclass" table="Subclass">
  <composite-id>
    <key-property name="OwnId" />
    <key-property name="InheritedId" />
  </composite-id>
</class>

しかし、代わりに次のようになります。

<class name="Subclass" table="Subclass">
  <composite-id>
    <key-property name="OwnId" />
  </composite-id>
  <property name="InheritedId" />
</class>

Jira で課題を開くことができます。

また、時間があれば、Github でフォークし、(テストを中断することなく) 修正し、プル リクエストを送信できます。

于 2012-08-28T22:41:41.607 に答える