DotNet Core 3 EF 3 с проблемой Cosmos DB
Я пытаюсь создать приложение на основе.Net Core 3 и EF Core 3 с Cosmos DB для базы данных.
Я уже выполнил следующие шаги,
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<MyDbContext>();
}
public class MyDbContextFactory : IDesignTimeDbContextFactory<MyDbContextFactory >
{
public MyDbContextFactory CreateDbContext(string[] args)
{
// Get environment
string environment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
// Build config
var config = new ConfigurationBuilder()
.SetBasePath(Path.Combine(Directory.GetCurrentDirectory()))
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddJsonFile($"appsettings.{environment}.json", optional: true)
.AddEnvironmentVariables()
.Build();
var cosmosDbOptions = config.GetSection("CosmosDb").Get<CosmosDbOptions>();
var (cosmosDbEndpoint, cosmosDbKey, databaseName, collectionData) = cosmosDbOptions;
var collectionNames = collectionData.Select(c => c.Name).ToList();
var optionsBuilder = new DbContextOptionsBuilder<MyDbContextFactory>();
optionsBuilder.UseCosmos(cosmosDbEndpoint, cosmosDbKey, databaseName);
return new ActivityLoggerContext(optionsBuilder.Options);
}
А также
public class MyDbContextFactory : DbContext
{
public MyDbContextFactory (DbContextOptions<MyDbContextFactory > dbContextOptions) : base(dbContextOptions)
{
}
public DbSet<UserModel> Users { get; set; }
}
И когда я выполняю команду,
> dotnet ef database update
Я получаю ошибку ниже. Любая помощь или указатель будут приветствоваться
System.InvalidOperationException: не удалось разрешить службу для типа Microsoft.EntityFrameworkCore.Migrations.IMigrator. Часто это происходит из-за того, что для этого DbContext не настроен поставщик базы данных. Поставщика можно настроить, переопределив метод DbContext.OnConfiguring или используя AddDbContext для поставщика службы приложения. Если используется AddDbContext, также убедитесь, что ваш тип DbContext принимает объект DbContextOptions в своем конструкторе и передает его в базовый конструктор для DbContext. в Microsoft.EntityFrameworkCore.Infrastructure.Internal.InfrastructureExtensions.GetService [TService] (IInfrastructure1 accessor)
at Microsoft.EntityFrameworkCore.Infrastructure.AccessorExtensions.GetService[TService](IInfrastructure
1) в Microsoft.EntityFrameworkCore.Design.DesignTimeServiceCollectionExtensions.<> C__DisplayClass1_0.b__7(IServiceProvider _) в Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResjection.ServiceLookup.CallSiteRuntimeResjection.ServiceLookup.CallSiteRuntimeResolver.VisitFactory.2.VisitCallSiteMain(ServiceCallSite callSite, TArgument argument)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitDisposeCache(ServiceCallSite transientCallSite, RuntimeResolverContext context)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor
2.VisitCallSite(ServiceCallSite callSite, аргумент TArgument) в Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.Resolve(ServiceCallSite callSite, ServiceProviderEngineScope scope) в Microsoft.Extensions.DependencyDependencyInjection.DynamiderScopeLine (область действия) в Microsoft.Extensions.DependencyDependencyInjection.DynamicScopeLineScopeLockerScopeLependencyDependencyDependencyInjection.DynamicScopeLine Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngine.GetService (Тип serviceType, ServiceProviderEngineScope serviceProviderEngineScope) в Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngine.GetSerjection.ServiceProviderEngine.GetService.DerviceProviderEngine.GetServicer. (Тип serviceType.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetService[T](поставщик IServiceProvider) в Microsoft.EntityFrameworkCore.Design.Internal.MigrationsOperations.EnsureServices(сервисы IServiceProvider) в Microsoft.EntityFrameworkCore.Design.Internal.MigrationsOperations.UpdateDatabase(String target.Design.Internal.MigrationsOperations.UpdateDatabase (String target.Design.Internal.MigrationsOperations.UpdateDatabase (String target.Design), в Microsoft contextTypentypeDatabase) (String target.Design), в Microsoft contextTypentypedatabase) (String targetMigration, Microsoft contextTypentype) OperationExecutor.UpdateDatabaseImpl(String targetMigration, String contextType) в Microsoft.EntityFrameworkCore.Design.OperationExecutor.UpdateDatabase.<> C__DisplayClass0_0. <. Ctor>b__0() в Microsoft.EntityFrameworkCore.Design.OperationExaction (ActionCore.Design.Oaction)UpdateDatabase (String targetMigration, String contextType) в Microsoft.EntityFrameworkCore.Design.OperationExecutor.UpdateDatabaseImpl(String targetMigration, String contextType) в Microsoft.EntityFrameworkCore.Design.OperationExecutor.UpdateDatabase.<> C__Display.Class0. EntityFrameworkCore.Design.OperationExecutor.OperationBase.Execute (действие действия)UpdateDatabase (String targetMigration, String contextType) в Microsoft.EntityFrameworkCore.Design.OperationExecutor.UpdateDatabaseImpl(String targetMigration, String contextType) в Microsoft.EntityFrameworkCore.Design.OperationExecutor.UpdateDatabase.<> C__Display.Class0. EntityFrameworkCore.Design.OperationExecutor.OperationBase.Execute (действие действия)
Не удалось разрешить службу для типа "Microsoft.EntityFrameworkCore.Migrations.IMigrator". Часто это происходит из-за того, что для этого DbContext не настроен поставщик базы данных. Поставщика можно настроить, переопределив метод DbContext.OnConfiguring или используя AddDbContext для поставщика службы приложения. Если используется AddDbContext, также убедитесь, что ваш тип DbContext принимает объект DbContextOptions в своем конструкторе и передает его в базовый конструктор для DbContext.
1 ответ
На основе сообщения об исключении вам необходимо настроить поставщика базы данных при добавлении службы dbcontext или в вашем dbcontext OnConfiguring
метод.
Я добился успеха, обратившись к следующему руководству: Использование DbContext с внедрением зависимостей
В этом руководстве используется SqlLite, вы можете изменить использование consmos db, добавив Microsoft.EntityFrameworkCore.Cosmos