流利的nHibernate,IDictionary混乱

时间:2010-10-13 15:04:52

标签: c# nhibernate fluent-nhibernate

使用以下类..

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惯例。如果可能的话,我宁愿采取更多关于解决方案的约定 - 而且我想更好地了解实际情况下的内容。

1 个答案:

答案 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+,你就不会看到大多数帮助主题中发布的方法,如上面链接的那些。