C# 流利的语言,词汇混乱

C# 流利的语言,词汇混乱,c#,nhibernate,fluent-nhibernate,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; } }

使用以下类

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; }
}
公共类特征
{
公共虚拟整数Id{get;set;}
公共虚拟字符串名称{get;set;}
}
公开课程表
{
公共虚拟整数Id{get;set;}
公共虚拟IDictionary影响{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");
    }
}
公共类TraitMap:ClassMap
{
公共交通地图
{
Id(x=>x.Id);
Map(x=>x.Name);
表(“特征”);
}
}
公共类SheetMap:ClassMap
{
公共小型张地图()
{
Id(x=>x.Id);
HasManyToMany(x=>x.implements)
.Schema(“表”)
.表格(“影响”)
.ParentKeyColumn(“特征”)
.ChildKeyColumn(“表”)
.AsMap(“评级”)
.Cascade.All();
表格(下称“表格”);
}
}
这是行不通的。我有个例外

Trait.Id的getter发生异常

现在,如果我把字典改成这样

public class Sheet
{
    public virtual int Id { get; set; }
    public virtual IDictionary<int, Trait> Influences { get; set; }
}
公共课程表
{
公共虚拟整数Id{get;set;}
公共虚拟IDictionary影响{get;set;}
}
基本上,把int作为键,把Trait作为值(不是我想要的),它确实有效。有人能解释这一点吗?我怎样才能更恰当地再现我正在尝试做的事情

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


我想按键的名称查找,而不是值的名称。虽然我意识到这在技术上是一个“可接受”的解决方案,但它有点违背字典惯例。如果可能的话,我更倾向于采用一种更为传统的方法而不是解决方案的方法,我希望更好地理解引擎盖下到底发生了什么。

您想要的是hbm中的映射将给您带来什么。我相信您需要的不是
AsMap
,而是
AsEntityMap
。然而,它谈到了(8月份)对地图的fluent映射的重写,这使得上述所有内容都过时了

编辑:有关
实体映射
和其他选项,请查看

HasMany(x=>x.implements)
.KeyColumn(“键列名称”)
.AsEntityMap(“引用的列名”)
.Entity(“dict value”,v=>v.Type());

另外,你说你使用的是最新版本——最新版本是1.1,但trunk是2.0,而且非常不同,而且更进一步。如果您不使用2.0+,您将看不到大多数帮助线程中发布的方法,就像上面链接的那样。

我已经阅读了该线程,不幸的是,它对我没有多大意义。我甚至在发布这个问题之前就找到了。此外,我有最新版本的fluent nhibernate,但我没有从HasMany()中找到.Index方法。麻烦您举一个例子,说明如何使用EntityMap来解决这个问题?我仍然很困惑。@Stacey添加了一些编辑,希望帮助1.1和2.0是如此不同,以至于很难找到帮助(专家在2.0上,但发布的版本是1.1)-也很难删除。我不确定你所说的“主干”是什么意思。我不使用github,我很难理解如何下载合适的文件。你下载过最新版本或1.1吗?如果最新版本在字典支持方面与1.1有很大不同。
  HasMany<Trait>(x => x.Influences)
    .KeyColumn("key column name")
    .AsEntityMap("referenced column name")
    .Entity("dict value", v=> v.Type<int>());