У меня есть две сущности: 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);
Код: Выделить всё
_shared.Industries.Where(i => i.Id == command.Id).Select(i => i.Organizations.Count).FirstAsync(cancellationToken)
Код: Выделить всё
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"));
Код: Выделить всё
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; }
}
Реалистично наиболее оптимальным запросом, который должен быть сгенерирован, будет:
Код: Выделить всё
SELECT COUNT(*)
FROM [Tenant].[OrganizationIndustries]
WHERE ([IndustryId] = @__command_Id_0);
Помощь в достижении этого была бы весьма кстати. оценил!
Подробнее здесь: https://stackoverflow.com/questions/784 ... -bad-query