2013-05-30 51 views
5

我具有類似於在Fluent NHibernate Mapping not on PK Field上多個非PK字段

然而所描述的情況功能NHibernate映射,我的表之間的關係是通過多個非主鍵列說明。 想象克里斯·米克的情況,但其中一個PersonJobTypeCode,它們一起應該(抱歉,這是一個傳統的數據庫)唯一地描述Person

Person 
------ 
Id PK 
JobType 
Code 
Name 

Order 
----- 
Id PK 
Person_JobType 
Person_Code 
OrderDetails 

塞爾哈特Özgel的answer描述了使用PropertyRef,但我找不到一個方法來爲多個列單獨執行此操作。我已經試過類似

class PersonMap : ClassMap<Person> 
{ 
    public PersonMap() 
    { 
     HasMany(p => p.Order) 
      .KeyColumns.Add("Person_JobType") 
      .PropertyRef("JobType") 
      .KeyColumns.Add("Person_Code") 
      .PropertyRef("Code") 
    } 
} 

但是,這顯然是行不通的,因爲KeyColumns.Add()回報被添加另一個OneToManyPart所以PropertyRef()不被反對個人柱。第二PropertyRef()簡單的覆蓋第一位的,我得到以下錯誤:

NHibernate.MappingException : collection foreign key mapping 
has wrong number of columns: MyApp.Person.Order type: Int32 

我已經看了KeyColumns.Add()的各種重載,

public TParent Add(string name) 
public TParent Add(params string[] names) 
public TParent Add(string columnName, Action<ColumnPart> customColumnMapping) 
public TParent Add(ColumnMapping column) 

特別近兩年,但找不到任何方法來設置PropertyRef爲每列:( 單獨水平是有辦法做到這一點?我要對這個使用的hbm.xml和FluentNHibernate有可能用錯誤的方式完全?

回答

3

在裏克

class PersonMap : ClassMap<Person> 
{ 
    public PersonMap() 
    { 
     Map(_ => JobTypeAndCode) 
      .Columns.Add("Person_JobType", "Person_Code") 
      .ReadOnly() 
      .LazyLoad() // optional: prevent loading the Columns twice 
      .Access.None(); 

     HasMany(p => p.Orders) 
      .KeyColumns.Add("Person_JobType", "Person_Code") 
      .PropertyRef("JobTypeAndCode") 
    } 

    private object JobTypeAndCode { get; set; } // FakeProperty 
} 

注:我從來沒有這樣使用NHibernate MappingByCode

+0

哇,不錯的工作。我最終爲此做的是在這些類之間沒有NHibernate映射,只是提取值並將它們拋回到另一個類的存儲庫,以便在必要時獲取適當的記錄 - 相當難看。我希望我上週知道你的技巧:) –

+0

這是我在嘗試這種方法時遇到的錯誤(無法通過它):任何映射可能不構成屬性的一部分-Re – dreamerkumar

+0

@VishalKumar更好地提出問題併發布一些碼?看起來屬性propertyref是referenceAny而不是Map – Firo