【问题标题】:How to Map Two Tables To One Class in Fluent NHibernate如何在 Fluent NHibernate 中将两个表映射到一个类
【发布时间】:2025-11-30 15:25:01
【问题描述】:

我在流畅的 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])) 必须有相同的数字 列作为引用的主要 键(位置名称 [LanguageId, 位置ID])

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

【问题讨论】:

  • 您正在尝试对对象中的数据进行非规范化...我只是认为这不会发生,而且它有点违背 ORM 的目的。我猜你总是可以非规范化你的表。
  • 您真的希望在 one 类中使用它,还是可以接受 LocationName 类和 Language 类?在这种情况下,您可以使用References() 方法映射关系。
  • 我很确定您需要将 WithKeyProperty(x => x.LanguageId) 更改为 WithKeyReference(x => x.LanguageId)。我已经好几年没用fluent了,通过代码转移到了内部映射。但要点是您需要将该 PK 的一部分作为参考。

标签: nhibernate fluent-nhibernate nhibernate-mapping


【解决方案1】:

您可以使用 , 不知道 FNH 中的名称来对类进行非规范化,即从另一个表中引入一列。见http://ayende.com/blog/3961/nhibernate-mapping-join

【讨论】:

  • 你可以使用“join”,我的意思是。