Рассмотрим следующие таблицы базы данных. К сожалению, таблицы не могут быть изменены каким-либо образом.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
Таблица площади имеет составной ключ, что означает, что определенная строка будет иметь несколько переводов. Например, у идентификатора области 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-генерируется в окне вывода и полученный список содержит Дома неправильно подобранные с областями.
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
Я не думаю, что это возможно. Довольно странный дизайн db, даже нелогичный - как один дом находится в нескольких областях и т. Д. Во всяком случае. –