2009-11-10 39 views
1

我有一個遺留數據庫,它使用guid將子項映射到父實體。通過輔助鍵映射Fluent Nhibernate中的字典

在我的領域層,我寧願掩蓋這一怪癖,所以我想有我父實體是這樣的:

public class Parent 
{ 
    virtual public int Id {get; protected set; } 
    virtual public string ParentContent { get; set; } 
    virtual public Guid ReferenceId { get; set; } 
    virtual public IDictionary<int,Child> Children { get; set; } 
} 

public class Child 
{ 
    virtual public int Id { get; protected set; } 
    virtual public Parent { get; set; } 
    virtual public string ChildContent { get; set; } 
} 

的父母會那麼每個Child.Id映射到兒童在兒童字典中。 Child映射工作正常,但我似乎無法爲父級找到合理的映射。

都存在父和子表在一個名爲ParentReferenceID場,所以我試圖用這樣的映射這樣的:

 mapping.HasMany<Broker>(x => x.Children) 
      .Table("Child") 
      .KeyColumn("ParentReferenceID") 
      .Inverse() 
      .AsMap<long>(index=>index.Id,val=>val.Type<Broker>()); 

不幸的是,這將產生一個錯誤: 類型或方法有2通用參數,但提供了1個通用參數。必須爲每個通用參數提供泛型參數。

爲了簡化我的問題,我開始嘗試使用Bag語義,用IList替換Parent的IDictionary。

mapping.HasMany<Broker>(x => x.Brokers) 
    .Table("Child") 
    .KeyColumn("ParentReferenceId") 
    .Inverse() 
    .AsBag(); 

產生較爲明顯的例外, System.Data.SqlClient.SqlException:操作數類型衝突:這是使用類似映射的唯一標識符是與詮釋

遺憾的是不兼容的,我似乎無法找出正確的方式告訴它加入ReferenceID字段。什麼是正確的方式來做到這一點?我更喜歡字典,但如果我甚至可以讓包工作,我會相當高興。

爲了清楚起見,我使用的是與從git中抽取的最近SharpArchitecture捆綁在一起的Fluent版本。 Fluent dll標記的版本是1.0.0.594,但如果更新的版本可以幫助,我很靈活。

回答

0

進一步挖掘導致我的袋子案的解決方案,雖然字典仍給我一點麻煩。

該解決方案需要修補Fluent NHibernate的OneToManyPart映射類。 (帽尖到This bug report: Could not map a one-to-many relationship where the key is not the primary key

mapping.HasMany(x => x.Children) 
     .Table("Child").KeyColumn("ParentReferenceId") 
     .PropertyRef("ReferenceId") 
     .Inverse() 
     .AsBag(); 

理論上,AsMap應該工作幾乎相同的方式,但由於某些原因,我不是完全清楚,它不會爲我工作。我會以後探索,但我願意提供建議。