NHibernate 正在忽略 ForeignKey 属性

NHibernate is ignoring ForeignKey property

情况

我目前正在处理的项目使用 NHibernate 和 Fluent NHibernate。
Oracle 数据库已经存在,无法更改。t/shouldn

我遇到的问题是 Fluent NHibernate 似乎忽略了以下代码示例中的 ForeignKey property/method。

Table("PERSON_PACKET");
Id(x => x.Id, "ID").GeneratedBy.UuidHex("N");

// Some Map(...) methods

References(x => x.Packet)
    .Column("PKT_IDENTIFICATION")
    .ForeignKey("IDENTIFICATION")
    .Cascade.None()
    .Fetch.Select()
    .Not.LazyLoad();

谁能解释一下这里发生了什么?

我是怎么发现这个的

这部分数据库的结构如下:

这三个实体实际上都是视图而不是表,但其背后的表是相似的。

PACKET 视图有两个相似的字段。一种叫做 IDENTIFICATION,它是一个数字,另一种叫做 ID,它是 IDENTIFICATION 与其他一些数据连接而成的 varchar。
PACKET_PERSON 的列 PKT_IDENTIFICATIONPACKET.ID 具有相同的串联格式(因此不是 PACKET.IDENTIFICATION

奇怪的是上面的映射有效,即使错误的列在 ForeignKey 方法中。此映射自 2014 年以来一直有效。
然后我尝试将 ForeignKey 方法更改为 ForeignKey("ID"),这也有效。

最后我将方法更改为 ForeignKey("JUST_SOMETHING_THAT_IS_NO_COLUMN") 并且一切正常。

这里发生了什么?

我认为该方法用于模式生成。我认为它等同于 NH XML 映射的 this 部分。

来自文档:

...specifies the name of the foreign key constraint generated for an association, use it on <one-to-one>, <many-to-one>, <key>, and <many-to-many> mapping elements.

这就是它没有任何明显效果的原因。如果您从映射文件生成数据库,您只会看到名为 JUST_SOMETHING_THAT_IS_NO_COLUMN 的外键约束。

如果您不打算生成架构,您的映射可能会变成:

References(x => x.Packet)
    .Column("PKT_IDENTIFICATION")
    .Cascade.None()
    .Fetch.Select()
    .Not.LazyLoad();

没有不良影响。