流利的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 Influences { get; set; } } 

我试图使用Fluent nHibernate映射它们,因此。

 public class TraitMap : ClassMap { public TraitMap() { Id(x => x.Id); Map(x => x.Name); Table("Traits"); } } public class SheetMap : ClassMap { public SheetMap() { Id(x => x.Id); HasManyToMany(x => x.Influences) .Schema("Sheets") .Table("Influences") .ParentKeyColumn("Trait") .ChildKeyColumn("Sheet") .AsMap("Rating") .Cascade.All(); Table("Sheets"); } } 

这不起作用。 我得到了例外。

Trait.Id出现例外情况

现在,如果我将Dictionary更改为这样..

 public class Sheet { public virtual int Id { get; set; } public virtual IDictionary Influences { get; set; } } 

基本上将int设为Key,将Trait设为值(不是我想要的),它确实有效。 任何人都可以解释这一点,以及我如何更恰当地重现我想要做的事情?

我认为推理是因为当我指定HasManyToMany时,我指定了集合的Value元素。 然而,这不是我的意图。

我希望通过键的名称来查找,而不是值的名称。 虽然我意识到这在技术上是一个“可接受的”解决方案,但它有点违反了Dictionary惯例。 如果可能的话,我宁愿采取更多的解决方案 – 而且我希望更好地了解实际情况。

你想要的是hbm中的映射会给你什么。 我相信你不需要AsEntityMap ,而是想要AsEntityMap 。 但是, 看看这个线程 ,它讨论了地图的流畅映射的重写(在8月),使得上述所有内容都过时了。

编辑 :对于AsEntityMap和其他选项,请看看这个问题 和答案

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

另外,你说你使用的是最新版本 – 最新版本是1.1,但是trunk是2.0,并且非常不同,而且还有很多。 如果你不是2.0+,你就不会看到大多数帮助线程中发布的方法,如上面链接的那些。