2

ここでクラスマッピングに問題があります。私は4つのテーブルを持っています:

  • 修理
  • リクエスト
  • コントロール
  • メッセージ

RequestにはテーブルFixおよびへの外部キーがありMessage、 にControlは への外部キーがありRequestます。基本的なマッピングは問題なく動作しますが、このクラスを使用しないため、このメッセージ テーブルにアクセスするさまざまなビューを介してすべての挿入と選択を行うため、外部キーを のタイプRequestMessage直接マッピングしたくありません。Message使用されるビューは、テーブルに保存されている値に依存しFixます。たとえば、Message101ビューオーバーMessageです (すべてのフィールドを使用するわけではなく、テーブルを使用したくないビジネス固有の理由が他にもありますMessage)。

指定されたシナリオでは、基本的な考え方は、次のようなマッピングを持つことです。

public class Request: Entity
{
    public virtual short Number { get; set; }      
    public virtual Fix Fix { get; set; }
    public virtual IMessage Message { get; set; }
}

すべてのクラスによって実装されるIMessageインターフェースです。クラスでMessageジェネリックを使用しようとしましたが、役に立ちませんでした。Request多分使用MappingOverrideすることができますか?

ありがとう

編集:

Any使用するために、オブジェクト タイプを検索するために使用する値をRequestテーブルに置いたので、オーバーライドは次のようになります。

    public override void OverrideMapping(IClassMapper<Request> __m)
    {
        __m.Any(x => x.Envio, typeof(long), m =>
            {
                m.IdType<long>();
                m.MetaType<short>();
                m.MetaValue(101, typeof(Message101));

                m.Columns(id =>
                {
                    id.Name("MessageId");
                    id.NotNullable(true);
                }, classRef =>
                {
                    classRef.Name("MessageType");
                    classRef.NotNullable(true);
                });

                m.Access(Accessor.Property);
                m.Cascade(Cascade.None);                   

            }
        );
    }           

しかし、私はエラーを受け取り続けnot-null property references a null or transient valueます。何か案は?

4

1 に答える 1

0

結局、識別子フィールドの参照を に配置する必要がありました。これにより、NHibernate からRequestのマッピングを使用できるようになりました。Any質問の編集で説明した問題は、私の意見では質問自体とは無関係であるため、Daniel Schillingによって提示された解決策が私の問題を解決しました。マッピングについてはAny、その仕組みの説明がここにあります。

于 2013-10-18T14:09:37.657 に答える