我使用Fluent NHibernate自動映射功能。我已經設法使用約定使數據庫映射非常接近,但有一些我需要IAutoMappingOverride。流利的NHibernate引用實體與自然鍵
在遺留系統中,我有一個實體類'Campus',它有一個NATURAL鍵'Code'。此密鑰的Oracle數據庫類型是VARCHAR2(3 BYTE)。我正在使用重寫,因爲我的約定會採用自動生成的代理鍵。我引用校園實體(有自然鍵)以外的實體類(如建築物),如下圖所示
<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中的默認,但它應該是VARCHAR2(3字節)。
我看到有一個mapping.NaturalId函數,但我不確定這是否工作正常,因爲如果我用這個來代替Id,我會得到一個映射異常。
我將不勝感激任何幫助如何處理這種情況。
親切的問候, 瑞恩。
感謝您的回覆。我會看看FNH郵件列表。乾杯。我不認爲我可以使用ManyToOneBuilder(Of TOther)的Column()函數來完成我所需要的操作,因爲這只是設置了列名(我已經正確設置了)。 ManyToOneBuilder(TOther)沒有CustomSqlType函數。我注意到有人提出了類似的問題(http://stackoverflow.com/questions/4588885/setting-customsqltype-on-references)。 –