NHibernate忽略了ForeignKey属性

时间:2017-05-05 12:26:44

标签: c# oracle nhibernate fluent-nhibernate

情况

我目前正在进行的项目使用NHibernate和Fluent NHibernate Oracle数据库已经存在,无法更改。

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

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();

有人能解释一下这里发生了什么吗?

我如何发现

数据库的这一部分具有以下结构:

ERD

所有这三个实体实际上都是Views而不是Tables,但它背后的表格是相似的。

PACKET视图有两个相似的字段。一个叫IDENTIFICATION,它是一个数字,一个名为IDIDENTIFICATION,其他一些数据连接在一起,是一个varchar。 PACKET_PERSON的列PKT_IDENTIFICATIONPACKET.ID具有相同的连接格式(因此不是PACKET.IDENTIFICATION

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

最后,我将方法更改为ForeignKey("JUST_SOMETHING_THAT_IS_NO_COLUMN"),事情仍然有效。

这里发生了什么?

1 个答案:

答案 0 :(得分:2)

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

来自文档:

  

...指定为关联生成的外键约束的名称,在<one-to-one><many-to-one><key><many-to-many>映射元素上使用它。< / p>

这就是为什么它没有任何可观察到的效果。如果从映射文件生成数据库,则只能看到名为JUST_SOMETHING_THAT_IS_NO_COLUMN的外键约束。

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

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

没有任何不良影响。