2011-07-11 23 views
1

我使用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,我會得到一個映射異常。

我將不勝感激任何幫助如何處理這種情況。

親切的問候, 瑞恩。

回答

0

我同意你的看法,FNH應該認識到關聯的另一端的列類型是VARCHAR,但顯然它不是。在the FNH mailing list

的範圍內詢問可能是值得的,但爲了解決您當前的問題,我認爲在您的映射重寫Building時,您可以指定使用哪種類型的列(使用Column()函數)你可以自己糾正這種行爲。

+0

感謝您的回覆。我會看看FNH郵件列表。乾杯。我不認爲我可以使用ManyToOneBuilder(Of TOther)的Column()函數來完成我所需要的操作,因爲這只是設置了列名(我已經正確設置了)。 ManyToOneBuilder(TOther)沒有CustomSqlType函數。我注意到有人提出了類似的問題(http://stackoverflow.com/questions/4588885/setting-customsqltype-on-references)。 –

相關問題