次のデータベーステーブルを検討してください。残念ながら、テーブルは決して変更できません。EntityFramework複合キーのコアの関係
Houses
Id
という名前の自動インクリメントIDフィールド、Name
という名前の文字列フィールドとAreaId
という名前の整数フィールドを持っています。後者はAreas
テーブルの外部キーではありません。
Areas
は、AreaId
,CountryId
およびLangId
からなる複合キーを持っています。同一のAreaId
の領域が存在する可能性がありますが、異なるCountryId
とLangId
があります。例:同じAreaId
の2つの行がありますが、異なるLangId
があります。
注:なぜHouse
に複数のArea
があるのですか? A House
には複数の値がありませんArea's, it only has one
エリア. The
エリアのテーブルに複合キーがあります。つまり、特定の行に複数の翻訳が含まれています。例:エリアID 5は、英語ではランゲッド5、スペイン語ではランゲッド3を持つ場合があります。
2つのテーブルは、次の2つの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が出力ウィンドウに生成され、結果のリストには、誤ってエリアに一致するハウスが含まれています。
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は[h].[Id]
なく[h].[AreaId]
で[a].[AreaId]
に関するものです。 EFでこの関係をどう表現することができますか?
複合キーに設定コードを表示できますか? – Sampath
私は複合キーの設定を追加して質問を編集しました – giannoug
私はそれが可能ではないと思います。奇妙なdbデザインbtw、たとえ非論理的でも - どのように1つの家がいくつかのエリアなどにあるとか。 –