asp.net-core - DotNet Core 3 EF 3 与 Cosmos DB 问题
问题描述
我正在尝试使用 Cosmos DB 数据库创建基于 .Net Core 3 和 EF Core 3 的应用程序。
我已经按照以下步骤,
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.CallSiteRuntimeResolver.VisitFactory(FactoryCallSite factoryCallSite, RuntimeResolverContext context) 在 Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor2.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 argument) 在 Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.Resolve(ServiceCallSite callSite, ServiceProviderEngineScope 范围) 在 Microsoft.Extensions.DependencyInjection.ServiceLookup.DynamicServiceProviderEngine.<>c__DisplayClass1_0.b__0(ServiceProviderEngineScope 范围) Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngine.GetService(Type serviceType, ServiceProviderEngineScope serviceProviderEngineScope) 在 Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngine.GetService(Type serviceType) 在 Microsoft.Extensions.DependencyInjection.ServiceProvider.GetService(Type serviceType) 在 Microsoft .Extensions.DependencyInjection.ServiceProviderServiceExtensions。Microsoft.EntityFrameworkCore.Design.Internal.MigrationsOperations.UpdateDatabase(String targetMigration, String contextType) 的 Microsoft.EntityFrameworkCore.Design.Internal.MigrationsOperations.EnsureServices(IServiceProvider services) 的 GetService[T](IServiceProvider provider)。 OperationExecutor.UpdateDatabaseImpl(String targetMigration, String contextType) 在 Microsoft.EntityFrameworkCore.Design.OperationExecutor.UpdateDatabase.<>c__DisplayClass0_0.<.ctor>b__0() 在 Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.Execute(Action action)Microsoft.EntityFrameworkCore.Design.OperationExecutor.UpdateDatabase.<>c__DisplayClass0_0.<.ctor>b__0() 的 Microsoft.EntityFrameworkCore.Design.OperationExecutor.UpdateDatabaseImpl(String targetMigration, String contextType) 的 Microsoft.EntityFrameworkCore.Design.OperationExecutor.UpdateDatabase(String targetMigration, String contextType)。 EntityFrameworkCore.Design.OperationExecutor.OperationBase.Execute(动作动作)Microsoft.EntityFrameworkCore.Design.OperationExecutor.UpdateDatabase.<>c__DisplayClass0_0.<.ctor>b__0() 的 Microsoft.EntityFrameworkCore.Design.OperationExecutor.UpdateDatabaseImpl(String targetMigration, String contextType) 的 Microsoft.EntityFrameworkCore.Design.OperationExecutor.UpdateDatabase(String targetMigration, String contextType)。 EntityFrameworkCore.Design.OperationExecutor.OperationBase.Execute(动作动作)
无法解析类型“Microsoft.EntityFrameworkCore.Migrations.IMigrator”的服务。这通常是因为没有为此 DbContext 配置数据库提供程序。可以通过覆盖 DbContext.OnConfiguring 方法或在应用程序服务提供者上使用 AddDbContext 来配置提供者。如果使用了 AddDbContext,那么还要确保您的 DbContext 类型在其构造函数中接受 DbContextOptions 对象并将其传递给 DbContext 的基本构造函数。
解决方案
根据异常消息,您需要在添加 dbcontext 服务时或在 dbcontext 的OnConfiguring
方法中配置数据库提供程序。
通过参考以下教程,我取得了成功:Using DbContext with dependency injection
在该教程中,它使用 SqlLite,您可以通过添加更改为使用 consmos dbMicrosoft.EntityFrameworkCore.Cosmos
推荐阅读
- amazon-web-services - 是否可以将网络负载均衡器用于使用 UDP 协议的 ECS 服务?
- laravel - Laravel 和 Vuejs axios 删除没有错误但没有删除
- sql-server - 声明具有负长度 varchar 列的表
- dart - Future.then() 执行得太早
- amazon-ec2 - AWS EC2 上的 WebRTC 与 2 个不同网络上的 AWS EC2 上的 TURN 服务器,错误:ICE 失败,添加 STUN 服务器
- c# - 如何添加与列表无关的新值
- rust - 为什么要做dbg!和 println!("{:?}") 显示不同的输出?
- c# - C# Process.Start - 独立进程
- javascript - 如何在 ES6 - Javascript 中使用 new-bind 和 addeventListeners?
- php - 访问php函数内的数组