FluentNHibernate,从另一个表中获取1列

FluentNHibernate,从另一个表中获取1列,nhibernate,fluent-nhibernate,join,Nhibernate,Fluent Nhibernate,Join,我们在使用FluentNHibernate时遇到了一个问题,我们的对象模型需要来自两个表的数据,如下所示: public class MyModel { public virtual int Id { get; set; } public virtual string Name { get; set; } public virtual int FooId { get; set; } public virtual string FooName { get; set; } }

我们在使用FluentNHibernate时遇到了一个问题,我们的对象模型需要来自两个表的数据,如下所示:

public class MyModel
{
   public virtual int Id { get; set; }
   public virtual string Name { get; set; }
   public virtual int FooId { get; set; }
   public virtual string FooName { get; set; }
}
其中有一个MyModel表,该表的Id、名称和FooId作为Foo表的外键。Foo表包含Id和foonname

这个问题与这里的另一篇帖子非常相似:但我正试图找出如何使用FluentNHibernate来解决这个问题

我可以很容易地生成Id、名称和FooId。但是映射FooName我遇到了麻烦。这是我的班级地图:

public class MyModelClassMap : ClassMap<MyModel>
{
   public MyModelClassMap()
   {
      this.Id(a => a.Id).Column("AccountId").GeneratedBy.Identity();
      this.Map(a => a.Name);
      this.Map(a => a.FooId);

      // my attempt to map FooName but it doesn't work
      this.Join("Foo", join => join.KeyColumn("FooId").Map(a => a.FooName));
   }
}
公共类MyModelClassMap:ClassMap
{
公共MyModelClassMap()
{
this.Id(a=>a.Id).Column(“AccountId”).GeneratedBy.Identity();
this.Map(a=>a.Name);
this.Map(a=>a.FooId);
//我尝试映射FooName,但不起作用
this.Join(“Foo”,Join=>Join.KeyColumn(“FooId”).Map(a=>a.FooName));
}
}
通过该映射,我得到以下错误:

命名空间“urn:nhibernate-mapping-2.2”中的元素“class”在命名空间“urn:nhibernate-mapping-2.2”中具有无效的子元素“join”。预期的可能元素列表:命名空间“urn:nhibernate-mapping-2.2”中的“联接子类、加载程序、sql插入、sql更新、sql删除、筛选器、结果集、查询、sql查询”


有什么想法吗?

我想你误解了这里的意思

您需要创建两个类,而不是将Id、Name、FooId和FooName放在同一个类中

public class MyModel
{
    public virtual int Id { get; set; }

    public virtual string Name { get; set; }

    public virtual Foo Foo { get; set; }
}

public class Foo
{
    public virtual int Id { get; set; }

    public virtual string FooName { get; set; }
}
以及用于以下各项的映射类:

public class MyModelMapping : ClassMap<MyModel>
{
    public MyModelMapping()
    {
        this.Id(x => x.Id);
        this.Map(x => x.Name);
        this.References(x => x.Foo);
    }
}

public class FooMapping : ClassMap<Foo>
{
    public FooMapping()
    {
        this.Id(x => x.Id);
        this.Map(x => x.FooName);
    }
}
公共类MyModelMapping:ClassMap { 公共MyModelMapping() { this.Id(x=>x.Id); this.Map(x=>x.Name); 这个.References(x=>x.Foo); } } 公共类映射:类映射 { 公共地图() { this.Id(x=>x.Id); this.Map(x=>x.foonName); } } 这应该会有所帮助


但请记住其他配置:)

是的,我传统上就是这样做的,因为本质上这是应该建模的(特别是因为数据库是这样设置的),但是我的需求(来自上面)不希望这样做。。。。此外,为了便于讨论,它是对实际问题的简化。真正的问题是,如果我们按照您建议的方式来做,那么类Foo将有一个Foo2类型的属性,而类Bar将有一个Foo2类型的属性…等等。这意味着当我只需要一个属性时,就有一堆不必要的连接/子选择。。。