HasMany
null許容型ではないキー列を使用してマッピングを実現しようとしています。
私のマッピングは次のようになります。
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はそれをパラメーターとして最初の挿入ステートメントに渡しました...