的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。之后,你的答案奏效了。 –