的hasMany映射我試圖實現HasMany
映射與非空的鍵列。與非空的鍵列
我的映射是這樣的:
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」,「表ID」)不能將NULL插入
現在,我讀到這個話題,普遍接受的解決方案相當多的職位似乎是使參考雙向,即將Table
屬性添加到DataExportColumn
並進行設置。
另一個「黑客」是使外鍵列可以爲空。 這不是我想要的。我希望NHibernate直接在INSERT語句中插入ID。
根據日誌文件,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 [Type32: :
命令0:INSERT INTO data_export_columns(NAME,data_export_columns_id)VA梅毒(:P0,:P1);: P0 = '列名'[類型:String(0)],:P1 = 1228 [類型:的Int32(0)]
正如你可以看到,簡單地NHibernate的省略了table_id
列,儘管ID是衆所周知的--NHibernate將它作爲參數傳遞給第一條插入語句...
謝謝您的回答。可惜的是,它仍然不:-('.Not.KeyNullable工作()'不添加列'table_id'到插入,它看起來就像是從我的問題之一。卸下從'NOT NULL'約束在數據庫中的表中,我可以看到,添加'.Not。KeyUpdate()'不會執行UPDATE與該列,使數據庫中的數據處於無效狀態... –
我認爲,因爲你接受了這個工作的答案。是什麼讓它工作? –
下面的答案得到了賞金:我不得不更新NH。之後,你的答案奏效了。 –