【问题标题】:DotNet Core 3 EF 3 with Cosmos DB IssueDotNet Core 3 EF 3 与 Cosmos DB 问题
【发布时间】:2019-11-28 00:36:16
【问题描述】:

我正在尝试使用 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](IInfrastructure1 访问者) 在 Microsoft.EntityFrameworkCore.Design.DesignTimeServiceCollectionExtensions.c__DisplayClass1_0.b__7(IServiceProvider _) 在 Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitFactory(FactoryCallSite factoryCallSite,RuntimeResolverContext 上下文) 在 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.CallSiteVisitor2.VisitCallSite(ServiceCallSite callSite,TArgument 参数) 在 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(类型 serviceType,ServiceProviderEngineScope serviceProviderEngineScope) 在 Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngine.GetService(类型 serviceType) 在 Microsoft.Extensions.DependencyInjection.ServiceProvider.GetService(类型 serviceType) 在 Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetService[T](IServiceProvider 提供程序) 在 Microsoft.EntityFrameworkCore.Design.Internal.MigrationsOperations.EnsureServices(IServiceProvider 服务) 在 Microsoft.EntityFrameworkCore.Design.Internal.MigrationsOperations.UpdateDatabase(字符串 targetMigration,字符串 contextType) 在 Microsoft.EntityFrameworkCore.Design.OperationExecutor.UpdateDatabaseImpl(字符串 targetMigration,字符串 contextType) 在 Microsoft.EntityFrameworkCore.Design.OperationExecutor.UpdateDatabase.c__DisplayClass0_0.<.ctor>b__0() 在 Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.Execute(操作动作) 无法解析类型“Microsoft.EntityFrameworkCore.Migrations.IMigrator”的服务。这通常是因为没有为此 DbContext 配置数据库提供程序。可以通过覆盖 DbContext.OnConfiguring 方法或在应用程序服务提供者上使用 AddDbContext 来配置提供者。如果使用了 AddDbContext,那么还要确保您的 DbContext 类型在其构造函数中接受 DbContextOptions 对象并将其传递给 DbContext 的基本构造函数。

【问题讨论】:

    标签: asp.net-core azure-cosmosdb ef-core-3.0


    【解决方案1】:

    根据异常消息,您需要在添加 dbcontext 服务时或在 dbcontext 的 OnConfiguring 方法中配置数据库提供程序。

    参考以下教程我已经成功了:Using DbContext with dependency injection

    在该教程中,它使用 SqlLite,您可以通过添加 Microsoft.EntityFrameworkCore.Cosmos 更改为使用 consmos db

    【讨论】:

    猜你喜欢
    • 2020-02-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-15
    • 2020-09-27
    • 2021-03-29
    • 2020-01-02
    • 1970-01-01
    • 2021-01-11
    相关资源
    最近更新 更多