使用以下类..
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; }
}
我试图使用Fluent 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发生了异常
现在,如果我将Dictionary更改为这样......
public class Sheet
{
public virtual int Id { get; set; }
public virtual IDictionary<int, Trait> Influences { get; set; }
}
基本上将int设为Key,将Trait设为值(不是我想要的),它确实有效。任何人都可以解释这一点,以及我如何更恰当地重现我想要做的事情?
我认为推理是因为当我指定
HasManyToMany<Trait>
时,我指定了集合的Value元素。但这不是我的意图。
我希望通过键的名称来查找,而不是值的名称。虽然我意识到这在技术上是一个“可接受的”解决方案,但它有点违反了Dictionary惯例。如果可能的话,我宁愿采取更多关于解决方案的约定 - 而且我想更好地了解实际情况下的内容。
答案 0 :(得分:2)
你想要的是hbm中的<composite-index>
映射会给你什么。我相信AsMap
而不是AsEntityMap
,而不是AsEntityMap
。但是,look at this thread谈到了对地图的流畅映射的重写(在8月),使得上述所有内容都过时了。
编辑:对于 HasMany<Trait>(x => x.Influences)
.KeyColumn("key column name")
.AsEntityMap("referenced column name")
.Entity("dict value", v=> v.Type<int>());
和其他选项,请查看this SO question and answer
{{1}}
另外,你说你使用的是最新版本 - 最新的版本是1.1,但是trunk是2.0,并且非常不同,而且还有很多。如果你不是2.0+,你就不会看到大多数帮助主题中发布的方法,如上面链接的那些。