如何在Fluent NHibernate中将两个表映射到一个类

如何在Fluent NHibernate中将两个表映射到一个类,nhibernate,fluent-nhibernate,nhibernate-mapping,Nhibernate,Fluent Nhibernate,Nhibernate Mapping,我对fluent nhiberbate将两个表映射到一个类有问题 我有以下数据库架构: TABLE dbo.LocationName ( LocationId INT PRIMARY KEY, LanguageId INT PRIMARY KEY, Name VARCHAR(200) ) TABLE dbo.Language ( LanguageId INT PRIMARY KEY, Locale CHAR(5) ) 并希望构建以下类定义: public class Lo

我对fluent nhiberbate将两个表映射到一个类有问题

我有以下数据库架构:

TABLE dbo.LocationName
(
  LocationId INT PRIMARY KEY,
  LanguageId INT PRIMARY KEY,
  Name VARCHAR(200)
)

TABLE dbo.Language
(
  LanguageId INT PRIMARY KEY,
  Locale CHAR(5)
)
并希望构建以下类定义:

public class LocationName 
{
      public virtual int LocationId { get; private set; }
      public virtual int LanguageId { get; private set; }
      public virtual string Name { get; set; }
      public virtual string Locale { get; set; } 
}
这是我的映射类:

  public LocalisedNameMap()
  {
     WithTable("LocationName");
     UseCompositeId()
        .WithKeyProperty(x => x.LanguageId)
        .WithKeyProperty(x => x.LocationId);
     Map(x => x.Name);

     WithTable("Language", lang =>
                             {
                                lang.WithKeyColumn("LanguageId");
                                lang.Map(x => x.Locale);
                             });
  }
问题在于Locale字段的映射来自另一个表,尤其是这些表之间的键不匹配。无论何时使用此映射运行应用程序,启动时都会出现以下错误:

外键 (FK7FC009CCEEA10EEE:语言 [LanguageId])必须具有相同的编号 列作为引用的主列的数目 键(LocationName[语言ID, 位置ID])


如何让nHibernate仅使用LanguageId字段从LocationName映射到Language?

您可以使用(不知道FNH中的名称)来反规范化类,即从另一个表中引入列。请看

您正在尝试对对象中的数据进行非规范化…我只是认为这不会发生,这有点违背了ORM的目的。我想,您总是可以对表进行非规范化。您真的希望在一个类中实现这一点,还是可以接受使用
LocationName
类和
语言
类?在这种情况下,您可以使用
References()
方法映射关系。我已经好几年没有使用fluent了,现在我开始使用代码进行内部映射。但要点是,你需要将PK的一部分作为参考。我的意思是,你可以使用“加入”。