gpt4 book ai didi

nhibernate - 具有不可为空键列的 HasMany 映射

转载 作者:行者123 更新时间:2023-12-04 00:20:09 26 4
gpt4 key购买 nike

我正在尝试实现 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: could not execute batch command.[SQL: SQL not available] ---> Oracle.DataAccess.Client.Orac leException: ORA-01400: cannot insert NULL into ("MYSCHEMA"."DATA_EXPORT_COLUMNS"."TABLE_ID")



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

NHibernate: select SQ_DATA_EXPORT_TABLES_ID.nextval from dual
NHibernate: Batch commands:
command 0:INSERT INTO data_export_tables (NAME, data_export_tables_id) VALUES (:p0, :p1);:p0 = 'table_name' [Type: String (0)], :p1 = 93 [Type: Int32 (0)]

NHibernate: Batch commands:
command 0:INSERT INTO data_export_columns (NAME, data_export_columns_id) VALUES (:p0, :p1);:p0 = 'column_name' [Type: String (0)], :p1 = 1228 [Type: Int32 (0)]



如您所见,NHibernate 简单地忽略了 table_id列,虽然 ID 是众所周知的 - NHibernate 将它作为参数传递给第一个插入语句......

最佳答案

这么近,需要设置Not.Inverse()this answer所示.

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

我不认为使双向关系成为一种黑客行为,并且通常需要进行查询。

关于nhibernate - 具有不可为空键列的 HasMany 映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14443719/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com