請考慮以下數據庫表。不幸的是,桌子不能以任何方式改變。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
我不認爲這是可能的。很奇怪的數據庫設計順便說一句,甚至不合邏輯 - 一個房子如何在幾個地區等等。無論如何。 –