我目前正在进行的项目使用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();
有人能解释一下这里发生了什么吗?
数据库的这一部分具有以下结构:
所有这三个实体实际上都是Views而不是Tables,但它背后的表格是相似的。
PACKET
视图有两个相似的字段。一个叫IDENTIFICATION
,它是一个数字,一个名为ID
,IDENTIFICATION
,其他一些数据连接在一起,是一个varchar。
PACKET_PERSON
的列PKT_IDENTIFICATION
与PACKET.ID
具有相同的连接格式(因此不是PACKET.IDENTIFICATION
)
奇怪的是上面的映射工作正常,即使ForeignKey
方法中的列错误。这种映射自2014年以来一直有效
然后我尝试将ForeignKey
方法更改为ForeignKey("ID")
,这也有效。
最后,我将方法更改为ForeignKey("JUST_SOMETHING_THAT_IS_NO_COLUMN")
,事情仍然有效。
这里发生了什么?
答案 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();
没有任何不良影响。