2012-06-08 25 views
3

我正在處理具有鎖定模式的遺留數據庫。我面臨的問題是一些表格被鍵入了已知/固定/硬編碼的實體類型Id值,而不是具有列值。這意味着我不能使用正常的參考結構。具有固定值的多對一缺失列

爲了與ENTITY_TYPEID表我可以這樣做:

public class EntityMap : ClassMap<Entity> 
{ 
    public EntityMap() 
    { 
     References(x => x.Type) 
     .Columns("ENTITY_SECTION","ENTITY_TYPEID"); 
    } 
} 

它高興地填充Entity.Type。

對於一個固定/已知的/硬編碼型的我需要映射到一個硬編碼值而不是ENTITY_TYPE列中,表,以便在代碼中對 - 短語:

public class EntityXMap : ClassMap<EntityX> 
{ 
    public EntityXMap(int entityType) 
    { 
     References(x => x.Type) 
     .Columns("ENTITY_SECTION", "ENTITY_TYPE = 123"); 
    } 
} 

的hasMany( )有一個Where()構造,我可以在這種情況下使用...

任何想法如何在此實現類似的東西?

回答

0

或許矯枉過正,但你可以嘗試

// add to config 
var typemap = new TypeMap(); 
typemap.Id(x => x.Section, "ENTITY_SECTION"); 
typemap.Where("ENTITY_TYPE = 123"); 
typemap.EntityName("Type for EntityX"); 

References(x => x.Type) 
    .Column("ENTITY_SECTION") 
    .EntityName("Type for EntityX"); 
+0

感謝您的FIRO。不幸的是,我無法改變Type對象的主鍵,因爲它在全對象中使用 - 我想我簡化了一些問題。 我已經設法通過創建一個SQL視圖來爲ENTITY_TYPE列添加固定值,並將該視圖用作FNH中的表。 我不確定這個選項會在生產中飛行...有其他選擇嗎? – SteveH

+0

視圖往往是更簡單的解決方案,如果可以的話,使用它們。根據我的經驗,鎖定模式通常意味着沒有額外的視圖,在這種情況下,只剩下解決方法。一個替代方案,我可以想到會是一個公式,不知道它是否適用於compositeIds – Firo

+0

做了一些更多的測試,這似乎是在流利NHibernate(和NHibernate的代碼映射,爲此)的遺漏。如果我回退到XML配置,我可以使用具有公式的多對一元素而不是ENTITY_TYPE列來執行此操作 - Fluent和代碼映射都會抱怨列計數不匹配。 – SteveH