首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有自然键的Fluent NHibernate引用实体

带有自然键的Fluent NHibernate引用实体
EN

Stack Overflow用户
提问于 2011-07-11 08:43:25
回答 1查看 510关注 0票数 1

我使用的是Fluent NHibernate自动映射功能。我已经设法使用约定获得了非常接近的数据库映射,但是有一些事情我需要使用IAutoMappingOverride。

在遗留系统中,我有一个实体类'Campus',它有一个自然键'Code‘。该键的Oracle数据库类型为VARCHAR2(3字节)。我对此使用了覆盖,因为我的约定将假设一个自动生成的代理键。我还有其他实体类(例如,Building),它们引用了校园实体(及其自然键),如下所示

代码语言:javascript
复制
<class name="Campus" table="CAMPUS" ... >
<id name="Id" type="String">
  <column name="camp_code" sql-type="VARCHAR2(3 BYTE)" />
  <generator class="assigned" />
</id>
<set name="Buildings" ...>
  <key foreign-key="buil_camp_fk">
    <column name="camp_code" />
  </key>
  <one-to-many class="Building" />
</set>
...
</class>

<class name="Building" table="BUILDING" ... >
...
<many-to-one class="Campus" name="Campus">
<column name="camp_code" not-null="true" />
</many-to-one>
...
</class>

使用以下覆盖,我生成的HBM映射似乎是正确的:

代码语言:javascript
复制
Public Class CampusMappingOverride
Implements IAutoMappingOverride(Of Campus)

Public Sub Override(ByVal mapping As AutoMapping(Of Campus)) Implements IAutoMappingOverride(Of Campus).Override
  mapping.Id(Function(campus) campus.Id, "camp_code").CustomSqlType("VARCHAR2(3 BYTE)")
End Sub

End Class

Public Class BuildingMappingOverride
Implements IAutoMappingOverride(Of Building)

Public Sub Override(ByVal mapping As AutoMapping(Of Building)) Implements IAutoMappingOverride(Of Building).Override
  mapping.References(Of Campus)(Function(building) building.Campus, "camp_code")
End Sub

End Class

但是,架构导出(Oracle数据库)不正确。

代码语言:javascript
复制
create table BUILDING (
   ...
   camp_code NVARCHAR2(255) not null,
   ...
)
create table CAMPUS (
   camp_code VARCHAR2(3 BYTE) not null,
   ...
   primary key (camp_code)
)

正如您所看到的,building.camp_code是NVARCHAR2(255),这似乎是Oracle的默认格式,但它应该是VARCHAR2(3字节)。

我看到有一个mapping.NaturalId函数,但我不确定它是否正常工作,因为如果我用它代替Id,我会得到一个映射异常。

如果您能帮助我解决这个问题,我将不胜感激。

亲切的问候,莱恩。

EN

回答 1

Stack Overflow用户

发布于 2011-07-12 04:50:21

我同意您的观点,FNH应该将关联另一端的列类型识别为VARCHAR,但显然它不是。

但是为了解决您当前的问题,我认为在您的构建映射覆盖中,您可以准确地指定要使用的列的类型(使用Column()函数),这样您就可以自己纠正该行为。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6644724

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档