简体   繁体   English

无法从根提供程序解析范围服务 - 错误的解决方案?

[英]Cannot resolve scoped service from root provider - solution to error?

I am coding an app with .Net MVC to print data from a database onto a page.我正在使用 .Net MVC 编写一个应用程序,以将数据库中的数据打印到页面上。 I have installed the EntityFrameworkCore SqlServer package and the EntityFrameworkCore Tools package, created some database classes, created a repository class and created and applied the database migration.我已经安装了 EntityFrameworkCore SqlServer 包和 EntityFrameworkCore Tools 包,创建了一些数据库类,创建了一个存储库类并创建并应用了数据库迁移。

However, when I try to run the line:但是,当我尝试运行该行时:

ApplicationDbContext context = app.ApplicationServices.GetRequiredService<ApplicationDbContext>()

I get presented with an error: "System.InvalidOperationException: 'Cannot resolve scoped service 'SportsStore.Models.ApplicationDbContext' from root provider.'"我收到一个错误:“System.InvalidOperationException: 'Cannot resolve scoped service 'SportsStore.Models.ApplicationDbContext' from root provider.'”

I know this is something to do with resolving the program scope, but I am not sure quite what code changes to make.我知道这与解决程序范围有关,但我不确定要进行哪些代码更改。

Here is the complete file, SeedData.cs:这是完整的文件 SeedData.cs:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Threading.Tasks;
    using Microsoft.AspNetCore.Builder;
    using Microsoft.Extensions.DependencyInjection;
    
    namespace SportsStore.Models
    {
        public static class SeedData
        {
            public static void EnsurePopulated(IApplicationBuilder app)
            {
                ApplicationDbContext context = app.ApplicationServices.GetRequiredService<ApplicationDbContext>();
                if (!context.Products.Any())
                {
                    context.Products.AddRange(
                        new Product
                        {
                            Name = "Kayak",
                            Description = "A boat for one person",
                            Category = "Watersports",
                            Price = 275
                        },
                        new Product
                        {
                            Name = "Lifejacket",
                            Description = "Protective and fashionable",
                            Category = "Watersports", Price = 48.95m
                        },
                        new Product
                        {
                            Name = "Soccer Ball",
                            Description = "FIFA-approved size and weight",
                            Category = "Soccer", Price = 19.50m
                        },
                        new Product
                        {
                            Name = "Corner Flags",
                            Description = "Give your playing field a professional touch",
                            Category = "Soccer",
                            Price = 34.95m
                        },
                        new Product
                        {
                            Name = "Stadium",
                            Description = "Flat-packed 35,000-seat stadium",
                            Category = "Soccer",
                            Price = 79500
                        },
                        new Product
                        {
                            Name = "Thinking Cap",
                            Description = "Improve brain efficiency by 75%",
                            Category = "Chess",
                            Price = 16
                        },
                        new Product
                        {
                            Name = "Unsteady Chair",
                            Description = "Secretly give your opponent a disadvantage",
                            Category = "Chess",
                            Price = 75
                        },
                        new Product
                        {
                            Name = "Bling-Bling King",
                            Description = "Gold-plated, diamond-studded King",
                            Category = "Chess",
                            Price = 1200
                        }
                    );
                    context.SaveChanges();
                }
            }
        }
    }

Here is my database context class, ApplicationDbContext.cs这是我的数据库上下文类 ApplicationDbContext.cs


    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Threading.Tasks;
    using Microsoft.EntityFrameworkCore;
    
    namespace SportsStore.Models
    {
        public class ApplicationDbContext : DbContext 
        {
            public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
                : base(options) {} // provides access to Entity Framework Core's underlying functionality
    
            public DbSet<Product> Products { get; set; } // Provides access to the Product objects in the database.
        }
    }

// Repository class - EFProductRepository.cs // 存储库类 - EFProductRepository.cs


    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Threading.Tasks;
    
    namespace SportsStore.Models{
        public class EFProductRepository : IProductRepository
        {
            private ApplicationDbContext context;
    
            public EFProductRepository(ApplicationDbContext ctx)
            {
                context = ctx;
            }
            public IEnumerable<Product> Products => context.Products; // maps the products property defined by IProductRepository onto Products property defined by the ApplicationDbContext class.
        }
    }

// startup.cs // 启动.cs


    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Threading.Tasks;
    using Microsoft.AspNetCore.Builder;
    using Microsoft.AspNetCore.Hosting;
    using Microsoft.AspNetCore.Http;
    using Microsoft.Extensions.DependencyInjection;
    using Microsoft.Extensions.Hosting;
    using SportsStore.Models;
    using Microsoft.Extensions.Configuration;
    using Microsoft.EntityFrameworkCore;
    
    namespace SportsStore
    {
        public class Startup
        {
            IConfigurationRoot Configuration;
    
            public Startup(IHostEnvironment env)
            {
                Configuration = new ConfigurationBuilder()
                    .SetBasePath(env.ContentRootPath)
                    .AddJsonFile("appsettings.json").Build();
            }
    
    
    
            // This method gets called by the runtime. Use this method to add services to the container.
            // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
            public void ConfigureServices(IServiceCollection services)
            {
                services.AddDbContext<ApplicationDbContext>(options =>
                    options.UseSqlServer(
                        Configuration["Data:SportStoreProducts:ConnectionString"])); // loads configuration settings in the appsettings.json file and makes them available through a property called Configuration.
                    services.AddTransient<IProductRepository,
                    EFProductRepository>();
                services.AddMvc(options => options.EnableEndpointRouting = false);
            }
    
            // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
            public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
            {
                if (env.IsDevelopment())
                {
                    app.UseDeveloperExceptionPage();
                    app.UseStatusCodePages();
                    app.UseStaticFiles();
                }
    
                app.UseRouting();
    
                app.UseMvc(routes =>
                {
                    routes.MapRoute(
                        name: "default",
                        template: "{controller=Product}/{action=List}/{id?}");
                });
                SeedData.EnsurePopulated(app);
            }
        }
    }

If there are any helpful suggestions out there, please let me know!如果有任何有用的建议,请告诉我! Thanks,谢谢,

Regards,问候,

Robert罗伯特

London, UK英国伦敦

You need to disable scope verification in the Program class:您需要在Program类中禁用范围验证:

public class Program {
...

public static IWebHost BuildWebHost(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .UseStartup<Startup>()
        .UseDefaultServiceProvider(options =>
            options.ValidateScopes = false)
        .Build();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 无法从根提供程序解析,因为它需要范围服务 - Cannot resolve from root provider because it requires scoped service 无法从根提供程序 .Net Core 2 解析范围服务 - Cannot resolve scoped service from root provider .Net Core 2 使用自定义EF Core SeriLog Sink“无法从根提供商解析作用域服务” - “Cannot resolve scoped service from root provider” with custom EF Core SeriLog Sink 当 &quot;ASPNETCORE_ENVIRONMENT&quot;: &quot;Development&quot; 时,无法从根提供程序解析范围服务 - Cannot resolve scoped service from root provider when "ASPNETCORE_ENVIRONMENT": "Development" 无法从根提供程序解析范围服务Microsoft.AspNetCore.Mvc.ViewFeatures.Internal.IViewBufferScope - Cannot resolve scoped service Microsoft.AspNetCore.Mvc.ViewFeatures.Internal.IViewBufferScope from root provider 无法从根提供程序解析范围服务“Services.Contracts.IHandler`1[Services.ProcessFile]” - Cannot resolve scoped service 'Services.Contracts.IHandler`1[Services.ProcessFile]' from root provider 无法从根提供程序解析作用域服务“Microsoft.AspNetCore.Identity.UserManager`1[IdentityServerSample.Models.ApplicationUser]” - Cannot resolve scoped service 'Microsoft.AspNetCore.Identity.UserManager`1[IdentityServerSample.Models.ApplicationUser]' from root provider 无法从根提供程序解析范围服务。 ASP.NET MVC 应用程序 - Cannot resolve scoped service from root provider. ASP.NET MVC app App 无法从根提供程序解析“ServiceBusConsumer”,因为它需要范围服务 DbContext - Cannot resolve 'ServiceBusConsumer' from root provider because it requires scoped service DbContext 无法从根提供程序解析“GraphQL.Resolvers.ICountriesResolver”,因为它需要范围服务“Query.Persistence.SampleDbContext” - Cannot resolve 'GraphQL.Resolvers.ICountriesResolver' from root provider because it requires scoped service 'Query.Persistence.SampleDbContext'
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM