2013-01-21 63 views
4

的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將它作爲參數傳遞給第一條插入語句...

回答

2

如此接近,您需要設置Not.Inverse(),如this answer所示。

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

我不認爲使雙向關係成爲黑客並且通常需要查詢。

+0

謝謝您的回答。可惜的是,它仍然不:-('.Not.KeyNullable工作()'不添加列'table_id'到插入,它看起來就像是從我的問題之一。卸下從'NOT NULL'約束在數據庫中的表中,我可以看到,添加'.Not。KeyUpdate()'不會執行UPDATE與該列,使數據庫中的數據處於無效狀態... –

+0

我認爲,因爲你接受了這個工作的答案。是什麼讓它工作? –

+0

下面的答案得到了賞金:我不得不更新NH。之後,你的答案奏效了。 –

2

你沒有提到你正在使用的NHibernate的版本 - 但我會注意,這似乎根據this jira issue已經被固定在3.2.0版本。

如果你堅持與NHibernate的另一個版本,我建議你做的關係是雙向的,因爲它是在我看來,使用可空FK一個更好的選擇。

+1

的確,我使用的是NHibernate 3.1。升級到最新版本解決了這個問題。對不起,花了這麼長時間回來給你,但升級花了一些時間:-) –