これはバグのようですが、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つの列があります:AliExpressIdとOwnId、およびこれら2つの列で構成される主キー。
実結果
Subclassという名前のデータベース内のテーブルで、その中に2つの列があります:AttachedIdとOwnId 、およびOwnIdだけで構成される主キー。
回避策
プロパティをサブクラスにコピーすると(としてマークを付けるnew
)、上記は問題なく機能します。
仮説
NHibernateソースを見ると、このTypeExtensions.DecodeMemberAccessExpression()
メソッドは、BaseClassをReflectedTypeとして指定するAttachedIdのMemberInfoを返し、少し後に宣言されたモデルが最終的に解析されるときに、Subclassを反映タイプとして指定するMemberInfoを返すようです。この2つは異なるため、以前にコンパイルされたマッピング対象のComposedIdから見つけることができません。typeof(Subclass).GetProperties()
ModelMapper.MapRootClass()
ヘルプ!
この問題に遭遇しましたか?私は何か変なことをしているのですか、それとも間違った振る舞いとしてNHibernateバグトラッカーに提出する必要がありますか?