4

HasManynull許容型ではないキー列を使用してマッピングを実現しようとしています。

私のマッピングは次のようになります。

public void Override(AutoMapping<DataExportTable> mapping)
{
    mapping.Table("data_export_tables");
    mapping.Id(x => x.Id).Column("data_export_tables_id")
           .GeneratedBy.Sequence("SQ_DATA_EXPORT_TABLES_ID");
    mapping.HasMany(x => x.Columns)
           .KeyColumn("table_id")
           .Not.KeyNullable()
           .Not.KeyUpdate()
           .Cascade.AllDeleteOrphan();
}

エンティティを保存するコードは次のようになります。

var table = new DataExportTable("table_name");
table.Columns.Add(new DataExportColumn("column_name"));
session.Save(table);
transaction.Commit();

これは例外をスローします:

NHibernate.Exceptions.GenericADOException:バッチコマンドを実行できませんでした。[SQL:SQLは使用できません] ---> Oracle.DataAccess.Client.Orac leException:ORA-01400:("MYSCHEMA"。"DATA_EXPORT_COLUMNS"にNULLを挿入できません。 " TABLE_ID ")

今、私はこのトピックに関するかなりの数の投稿を読みました。一般的に受け入れられている解決策は、参照を双方向にすること、つまり、Tableプロパティを追加しDataExportColumnて設定することであるようです。
もう1つの「ハック」は、外部キー列をnull許容にすることです。それは私が望んでいることではありません。NHibernateにIDをINSERTステートメントに直接挿入してほしい。
ログファイルによると、NHibernateはINSERTステートメントを実行するときにIDを確実に認識しています。

NHibernate:デュアル
NHibernateからSQ_DATA_EXPORT_TABLES_ID.nextvalを選択:バッチコマンド:
コマンド0:INSERT INTO data_export_tables(NAME、data_export_tables_id)VALUES(:p0、:p1);: p0 ='table_name' [Type:String(0)]、:p1 = 93 [タイプ:Int32(0)]

NHibernate:バッチコマンド:
コマンド0:INSERT INTO data_export_columns(NAME、data_export_columns_id)VALUES(:p0、:p1);: p0 ='column_name' [Type:String(0)]、:p1 = 1228 [Type:Int32(0 )]

ご覧のとおりtable_id、IDはよく知られていますが、NHibernateは単に列を省略します-NHibernateはそれをパラメーターとして最初の挿入ステートメントに渡しました...

4

2 に答える 2

2

とても近いので、この回答Not.Inverse()に示されているように設定する必要があります。

mapping.HasMany(x => x.Columns)
       .KeyColumn("table_id")
       .Not.Inverse()
       .Not.KeyNullable()
       .Not.KeyUpdate()
       .Cascade.AllDeleteOrphan();

関係を双方向にすることをハックとは考えていません。通常、クエリを実行するために必要です。

于 2013-01-21T18:28:23.260 に答える
2

使用しているNHibernateのバージョンについては言及されていませんが、このjiraの問題によると、バージョン3.2.0で修正されているようです。

NHibernateの別のバージョンで立ち往生している場合は、関係を双方向にすることをお勧めします。これは、私の意見ではnull許容FKを使用するよりもはるかに優れた代替手段です。

于 2013-01-25T17:57:55.263 に答える