我正在使用Fluent NHibernate自动化功能。我已经设法使用约定非常接近数据库映射,但有一些东西我需要IAutoMappingOverride。
在遗留系统中,我有一个实体类'Campus',它有一个NATURAL键,'Code'。此密钥的Oracle数据库类型为VARCHAR2(3 BYTE)。我正在使用覆盖,因为我的约定会假设一个自动生成的代理键。我有其他实体类(例如Building)引用Campus实体(使用其自然键),如下所示
<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映射似乎是正确的:
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数据库)不正确。
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中String的默认值,但它应该是VARCHAR2(3 BYTE)。
我看到有一个mapping.NaturalId函数,但我不确定这是否正常工作,因为如果我使用它来代替Id,我会得到一个映射异常。
对于如何处理这种情况,我将不胜感激。
亲切的问候, 莱恩。
答案 0 :(得分:0)
我同意你的看法,FNH应该将协会另一方的列类型识别为VARCHAR,但显然它不是。在the FNH mailing list
询问可能是值得的但为了解决您当前的问题,我认为在您的映射覆盖建筑物时,您可以准确指定要使用的列类型(使用Column()
函数),以便您可以通过自己。