Nhibernate 具有不可为空的键列的多个映射

Nhibernate 具有不可为空的键列的多个映射,nhibernate,fluent-nhibernate,Nhibernate,Fluent Nhibernate,我正在尝试使用不可为空的键列实现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_EXP

我正在尝试使用不可为空的键列实现
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:无法将NULL插入(“MYSCHEMA”“数据导出列”“表ID”)

现在,我读了很多关于这个主题的帖子,普遍接受的解决方案似乎是使引用具有双向性,即向
DataExportColumn
添加
属性并进行设置。
另一个“黑客”是使外键列为空。 那不是我想要的。我希望NHibernate直接在insert语句中插入ID。
根据日志文件,NHibernate在执行INSERT语句时肯定知道ID:

NHibernate:从dual中选择SQ_数据_导出_表格_ID.nextval
NHibernate:批处理命令:
命令0:将值(:p0,:p1)插入到数据导出表(名称、数据导出表\u id)中:p0='表名称'[类型:字符串(0)],:p1=93[类型:Int32(0)]

NHibernate:批处理命令:
命令0:将值(:p0,:p1)插入到数据导出列(名称、数据导出列\u id)中:p0= '列名称'[类型:字符串(0)],:p1=1228[类型:Int32(0)]


正如您所看到的,NHibernate只需将
表id
列作为一个参数传递给第一个insert语句,尽管该id是众所周知的-NHibernate将其作为参数传递给了第一个insert语句…

如此接近,您需要设置
Not.Inverse()
,如中所示


<>我不认为让关系双向是一个黑客,它通常是必要的查询。

你没有提到你使用的nHiBiNT版本-但是我会注意到这似乎已经在版本3.2.0中根据

被修正了。
如果您仍在使用另一个版本的NHibernate,我建议您将这种关系设置为双向关系,因为在我看来,这比使用可为空的FK要好得多。

谢谢您的回答。不幸的是,它仍然不起作用:-(
.Not.KeyNullable()
没有将列
table\u id
添加到insert,它看起来就像我问题中的一个。从数据库中的表中删除
Not NULL
约束,我可以看到,添加
.Not.keydupdate()
将不会使用该列执行更新,使数据库中的数据处于无效状态…我假设,既然您接受了答案,您就可以使用它了。是什么让它起作用?下面的答案获得了奖励:我必须更新NH。在那之后,您的答案起作用了。事实上,我正在使用NHibernate 3.1。升级到最新版本版本解决了此问题。很抱歉花了这么长时间才返回给您,但升级花了一些时间:-)
mapping.HasMany(x => x.Columns)
       .KeyColumn("table_id")
       .Not.Inverse()
       .Not.KeyNullable()
       .Not.KeyUpdate()
       .Cascade.AllDeleteOrphan();