2010-10-13 81 views
1

使用下面的類..功能NHibernate,IDictionary的混亂

public class Trait 
{ 
    public virtual int Id { get; set; } 
    public virtual string Name { get; set; } 
} 
public class Sheet 
{ 
    public virtual int Id { get; set; } 
    public virtual IDictionary<Trait, int> Influences { get; set; } 
} 

我試圖把它們映射使用功能NHibernate,因爲這樣的。

public class TraitMap : ClassMap<Trait> 
{ 
    public TraitMap() 
    { 
     Id(x => x.Id); 
     Map(x => x.Name); 
     Table("Traits"); 
    } 
} 
public class SheetMap : ClassMap<Sheet> 
{ 
    public SheetMap() 
    { 
     Id(x => x.Id); 

     HasManyToMany<Trait>(x => x.Influences) 
      .Schema("Sheets") 
      .Table("Influences") 
      .ParentKeyColumn("Trait") 
      .ChildKeyColumn("Sheet") 
      .AsMap<int>("Rating") 
      .Cascade.All(); 

     Table("Sheets"); 
    } 
} 

這是行不通的。我明白了。

異常發生吸氣Trait.Id的現在

,如果我改變了字典了,看起來像這樣..

public class Sheet 
{ 
    public virtual int Id { get; set; } 
    public virtual IDictionary<int, Trait> Influences { get; set; } 
} 

基本上使得INT的關鍵,而特質價值(不是我想要的),它確實有效。任何人都可以解釋這一點,以及我如何能夠更恰當地重現我正在嘗試做的事情?

我認爲這是因爲當我指定HasManyToMany<Trait>時,我指定了集合的Value元素。但是,這不是我的意圖。

我想通過密鑰的名稱而不是價值的名稱來查找。雖然我認識到這在技術上是一種「可接受」的解決方案,但它違背了字典慣例。如果可能的話,我寧願採取更多的解決方案,而且我希望更好地理解實際情況。

回答

2

你想要什麼<composite-index>映射在HBM會給你。我相信,而不是AsMap,你想要AsEntityMap。然而,look at this thread其中談到重寫(八月)流利的映射的地圖,使所有上述過時。

編輯:對於AsEntityMap,和其他選項,看看this SO questionand answer

HasMany<Trait>(x => x.Influences) 
    .KeyColumn("key column name") 
    .AsEntityMap("referenced column name") 
    .Entity("dict value", v=> v.Type<int>()); 

而且,你說你在最新版本 - 最新發佈是1.1,但樹幹是2.0,並且是非常不同的,並且更進一步。如果你不在2.0以上,你將看不到像上面鏈接的大多數幫助主題中發佈的方法。

+0

我已經閱讀過這個帖子,不幸的是它對我沒什麼意義。我甚至在發佈這個問題之前就發現了它。此外,我有流利的nhibernate的最新版本,我沒有找到HasMany()的.Index方法。 – Ciel 2010-10-13 15:36:38

+0

我可以打擾你舉例說明如何使用AsEntityMap來解決這個問題嗎?我仍然很困惑。 – Ciel 2010-10-13 15:42:07

+0

@Stacey添加了一些編輯,希望幫助1.1和2.0如此不同以至於很難找到幫助(專家在2.0,但發佈的版本是1.1) - 並且很難刪除。 – 2010-10-13 15:54:14