请考虑以下数据库表。不幸的是,桌子不能以任何方式改变。EntityFramework与组合键的核心关系
Houses
有一个名为Id
一个自动递增ID字段,命名为Name
一个字符串字段,并命名为AreaId
整型字段。后者不是Areas
表的外键。
Areas
具有由AreaId
,CountryId
和LangId
组成的组合键。与AreaId
相同的区域可以存在,但可以使用不同的CountryId
和LangId
。例如:可以有两排具有相同的AreaId
但不同的LangId
。
注意:为什么House
有多个Area
? A House
没有多个Area's, it only has one
区域. The
区域表有一个组合键,这意味着特定的行将有多个转换。例如:区域ID 5可能具有英语LangId 5和西班牙语LangId 3。
这两个表由以下两个C#类描述。
public class House
{
public int Id { get; set; }
[MaxLength(80)]
public string Name { get; set; }
public int? AreaId { get; set; }
[ForeignKey("AreaId")]
public List<Area> Areas { get; set; }
}
public class Area
{
public int AreaId { get; set; }
public int CountryId { get; set; }
public string LangId { get; set; }
public string Name { get; set; }
}
组合键在上下文中定义,完全如文档中所述。
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Area>()
.HasKey(a => new { a.AreaId, a.CountryId, a.LangId });
}
例如,让我们获取数据库中所有房屋的列表,包括它们各自的区域。
_context.Houses.Include(h => h.Areas).ToList();
在输出窗口中生成以下SQL,并且生成的List包含与区域错误匹配的房屋。
SELECT [a].[AreaId], [a].[CountryId], [a].[LangId], [a].[Name]
FROM [Areas] AS [a]
WHERE EXISTS (
SELECT 1
FROM [Houses] AS [h]
WHERE [a].[AreaId] = [h].[Id])
ORDER BY [a].[Id]
正如你所看到的,涉及的EntityFramework与[a].[AreaId]
和[h].[Id]
不[h].[AreaId]
。我如何在EF中表达这种关系?
可以显示组合密钥上的配置代码吗? – Sampath
我编辑了这个问题,添加了复合键的配置 – giannoug
我不认为这是可能的。很奇怪的数据库设计顺便说一句,甚至不合逻辑 - 一个房子如何在几个地区等等。无论如何。 –