2013-01-21 25 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。升级到最新版本解决了这个问题。对不起,花了这么长时间回来给你,但升级花了一些时间:-) –