Недавно мы обновили версию 2.2 до .NET Core 3.1, а вместе с ней также обновились до EF Core. 3.1 из 2.2, и есть несколько API, которые не работают или имеют какие-то странные проблемы, которых не было до сих пор. Мне нужна помощь в понимании таких проблем и их устранении.
Некоторые замечания:
- Проблема не возникает, если я понижаю версию EF Core 3.1 до 2.2
- Проблема не возникает при локальном тестировании API, она возникает появляется только при развертывании API.
- Для развертывания мы используем Docker-контейнер на виртуальной машине Linux. Ниже я поделился файлом Docker с другими подробностями.
Тип ошибки: SqlException
Сообщение об ошибке: неверное имя столбца «__roleName_0»
public async Task[*]> GetUsersAsync(string roleName, int offset, int? limit)
{
var query = _dbContext.UserView.AsNoTracking().Where(u => u.UserRole.Any(ur => ur.Role.Name == roleName));
var userResult = await query.ToListAsync();
return userResult;
}
Как вы можете видеть в функции GetUsersAsync, она имеет одну операцию с базой данных:
- Получить пользователей, отфильтрованных по предикату, принадлежащему этой роли.
Отфильтруйте пользователей по предикату, принадлежащему этой роли.
Executed DbCommand (177ms) [Parameters=[@__roleName_0='?' (Size = 4000)]
SELECT
FROM
(
SELECT
FROM [V_User] AS [v]
WHERE (EXISTS (
SELECT 1
FROM [UserRole] AS
INNER JOIN [Role] AS [r] ON .[RoleId] = [r].[Id]
WHERE [v].[Id] = .[UserProfileId]) AND ([r].[Name] = @__roleName_0)
)
По какой-то причине EF Core воспринимает параметр __roleName_0 как столбец, что, по-видимому, и является проблемой. Мы попробовали несколько ресурсов, включая чтение информации об ошибках. изменения, внесенные в EF Core 3.0/3.1, но не удалось выяснить причину этой проблемы. Пожалуйста, помогите.
Другие технические подробности:
Dockerfile:
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1.2 AS base
WORKDIR /app
EXPOSE 80
FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build
WORKDIR /src
COPY /.csproj /
RUN dotnet restore /.csproj
COPY . .
WORKDIR /src/
RUN dotnet build .csproj -c Release -r ubuntu.16.04-x64 -f netcoreapp3.1 -o /app
FROM build AS publish
RUN dotnet publish .csproj -c Release -r ubuntu.16.04-x64 -f netcoreapp3.1 --self-contained -o /app
FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", ".dll"]
Подробнее здесь: https://stackoverflow.com/questions/621 ... ore-3-1-on