EF Core 8 подсчитывает отношения «многие ко многим», генерирующие неверный запросC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 EF Core 8 подсчитывает отношения «многие ко многим», генерирующие неверный запрос

Сообщение Anonymous »

Я использую SQL Server 2019 и EF Core 8.
У меня есть две сущности: TenantOrganization (Организация) и SharedIndustry (Промышленность), которые имеют связь «многие-ко-многим» через объединяющую сущность TenantOrganizationIndustries (OrganizationIndustries). Начиная с идентификатора отрасли, я хотел бы подсчитать количество отраслей организации, с которыми она связана, чтобы я мог разрешить или запретить удаление отрасли. Shared и Tenant — это схемы в базе данных.
Проблема, с которой я столкнулся, заключается в том, что EF Core генерирует неправильный запрос и неправильно называет таблицу. в объединении запроса. В частности, он называет [Tenant].[Organizations] как [TenantOrganization], при этом игнорируется часть имени схемы и выделяется имя таблицы в единственном числе.
Это генерируемый запрос:

Код: Выделить всё

SELECT TOP(1) (
SELECT COUNT(*)
FROM [Tenant].[OrganizationIndustries] AS [o]
INNER JOIN [TenantOrganization] AS [t] ON [o].[OrganizationId] = [t].[Id]-- WRONG table name
WHERE [i].[Id] = [o].[IndustryId])
FROM [Shared].[Industries] AS [i]
WHERE [i].[Id] = @__command_Id_0
Где будет правильная версия запроса (переформатированная на мой вкус):

Код: Выделить всё

SELECT TOP(1)   (
SELECT  COUNT(*)
FROM    [Tenant].[OrganizationIndustries] AS [TOI]
INNER JOIN [Tenant].[Organizations] AS [TO] ON ([TOI].[OrganizationId] = [TO].[Id])-- CORRECT table name
WHERE   ([SI].[Id] = [TOI].[IndustryId])
)
FROM            [Shared].[Industries] AS [SI]
WHERE           ([SI].[Id] = @__command_Id_0);
Это запрос LINQ, который я использую для создания сгенерированного запроса:

Код: Выделить всё

_shared.Industries.Where(i => i.Id == command.Id).Select(i => i.Organizations.Count).FirstAsync(cancellationToken)
Это конфигурация навигации для объектов в DbContext:

Код: Выделить всё

builder.Entity().HasMany(
to => to.Industries).WithMany(
si => si.Organizations).UsingEntity(
"OrganizationIndustries",
l => l.HasOne(typeof(SharedIndustry)).WithMany().HasForeignKey(nameof(TenantOrganizationIndustry.IndustryId)).HasPrincipalKey(nameof(SharedIndustry.Id)),
r => r.HasOne(typeof(TenantOrganization)).WithMany().HasForeignKey(nameof(TenantOrganizationIndustry.OrganizationId)).HasPrincipalKey(nameof(TenantOrganization.Id)),
j => j.ToTable("OrganizationIndustries", "Tenant"));
И, наконец, это модели EF Core:

Код: Выделить всё

public sealed class SharedIndustry {
public SharedIndustryId Id { get; set; }
public ICollection Organizations { get; } = [];
}

public sealed class TenantOrganization {
public TenantOrganizationId Id { get; set; }
public ICollection Industries { get; } = [];
}

public sealed class TenantOrganizationIndustry {
public SharedIndustryId IndustryId { get; set; }
public TenantOrganizationId OrganizationId { get; set; }
}
Как заставить EF Core сгенерировать правильный запрос, в частности использовать правильное имя для таблицы? Я делаю это без DbSet для TenantOrganizationIndustry, но начинаю задаваться вопросом, придется ли мне это делать, чтобы это работало.
Реалистично наиболее оптимальным запросом, который должен быть сгенерирован, будет:

Код: Выделить всё

SELECT  COUNT(*)
FROM    [Tenant].[OrganizationIndustries]
WHERE   ([IndustryId] = @__command_Id_0);
Но я не думаю, что смогу обойтись без DbSet для TenantOrganizationIndustry. На данный момент мне хотелось бы посмотреть, смогу ли я правильно определить это соединение «многие ко многим», чтобы генерировался правильный запрос.
Помощь в достижении этого была бы весьма кстати. оценил!

Подробнее здесь: https://stackoverflow.com/questions/784 ... -bad-query
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»