【发布时间】: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