Вопрос или проблема
При обновлении моих NuGet-пакетов с версии 7.6.0 до 8.x команда миграции EF Core завершается с ошибкой. Она работает, когда я не обновляю.
<PackageReference Include="Microsoft.IdentityModel.JsonWebTokens" Version="7.6.0" />
<PackageReference Include="Microsoft.IdentityModel.Logging" Version="7.6.0" />
<PackageReference Include="Microsoft.IdentityModel.Protocols" Version="7.6.0" />
<PackageReference Include="Microsoft.IdentityModel.Protocols.OpenIdConnect" Version="7.6.0" />
<PackageReference Include="Microsoft.IdentityModel.Tokens" Version="7.6.0" />
Команда EF:
dotnet ef migrations add Test
(но также выдает ошибку, например, dotnet ef migrations has-pending-model-changes)
DbContext:
public class GenesisDbContext : DbContext
{
private readonly IHttpContextAccessor httpContextAccessor;
public GenesisDbContext(DbContextOptions<GenesisDbContext> dbContextOptions, IHttpContextAccessor httpContextAccessor) : base(dbContextOptions)
{
_httpContextAccessor = httpContextAccessor;
AppContext.SetSwitch("Npgsql.EnableLegacyTimestampBehavior", true);
}
// Просто несколько DbSet и инициализация здесь
Когда я выполняю команду с версией 7.6.0
dotnet ef migrations has-pending-model-changes
Я получаю:
С момента последней миграции в модель не было внесено изменений.
Когда я обновляюсь до версии 8.1.0, я получаю:
Невозможно создать ‘DbContext’ типа ”. Исключение ‘Невозможно разрешить службу для типа ‘Microsoft.EntityFrameworkCore.DbContextOptions`1[SMS.Server.Genesis.Data.GenesisDbContext]’ при попытке активировать ‘KommuneAktiv.SMS.Server.Genesis.Data.GenesisDbContext’.’ было выброшено при попытке создать экземпляр. Для различных поддерживаемых шаблонов во время разработки см. https://go.microsoft.com/fwlink/?linkid=851728
Я не могу ничего попробовать здесь, кроме как “не обновлять” 🙂
Ответ или решение
Проблема, с которой вы столкнулись, связана с изменениями, внесёнными в библиотеку Microsoft.IdentityModel.JsonWebTokens при переходе с версии 7.6.0 на 8.x. Во время миграции Entity Framework Core (EF Core) возникает ошибка, которая указывает на невозможность разрешить службу для типа DbContextOptions<GenesisDbContext>
. Это может означать, что DI (Dependency Injection) контейнер не настроен должным образом после обновления.
Вот несколько шагов, которые помогут вам решить эту проблему:
-
Проверьте конфигурацию службы для контекста базы данных
Убедитесь, что вы правильно настраиваетеDbContext
в вашем классеStartup
или в методеProgram.cs
. Пример правильной конфигурации:public void ConfigureServices(IServiceCollection services) { services.AddDbContext<GenesisDbContext>(options => options.UseNpgsql(Configuration.GetConnectionString("DefaultConnection"))); services.AddHttpContextAccessor(); // Другие службы }
-
Обновите зависимости
Убедитесь, что все ваши зависимости совместимы между собой. Иногда обновление одной библиотеки требует синхронного обновления других библиотек. Проверьте все зависимости на предмет совместимости с новой версиейJsonWebTokens
. -
Обновите пакеты EF Core
Убедитесь, что вы также используете совместимую версию Entity Framework Core. Например, если вы обновили Microsoft.IdentityModel.JsonWebTokens до 8.x, убедитесь, что EF Core обновлён до последней версии. -
Настройка
DbContext
для проектирования
Если вы хотите использовать миграции с помощью командыdotnet ef
, убедитесь, что у вас есть подходящий конструктор в классеDbContext
. Например, добавьте конструктор без параметров, который будет использоваться во время проектирования:public GenesisDbContext(DbContextOptions<GenesisDbContext> options) : base(options) { }
-
Проблема с внедрением зависимостей
Обратите внимание на ошибку, которая указывает на отсутствие разрешенной службы. Это может указывать на то, что при попытке выполнить команду миграции EF CLI не может получить экземпляр вашегоDbContext
из DI контейнера. Убедитесь, что вашDbContext
правильно зарегистрирован. -
Проверка миграций
Если проблема продолжает возникать, попробуйте создать новую миграцию или откатиться до предыдущих миграций и проверить, работает ли команда. Возможно, что нужно будет пересоздать базу данных, если вы внесли значительные изменения в модель. -
Ошибки во время выполнения миграций
Если ошибка всё еще остается и указано, что ничего не изменено, попробуйте сбросить миграции с помощью командыdotnet ef migrations remove
и затем снова создать новую миграцию. -
Консультация документации
Обязательно обратитесь к официальной документации о том, как использовать EF Core с DI и как изменились процессы в версии 8.x, чтобы избежать непроблемных сценариев.
Если следуя данным инструкциям, вы все равно не можете решить проблему, пожалуйста, приведите дополнительные детали кода и конфигурации, чтобы получить более конкретные рекомендации.