C# ASP.NET核心2种子数据库

C# ASP.NET核心2种子数据库,c#,asp.net,.net,.net-core-2.0,C#,Asp.net,.net,.net Core 2.0,关于这一点,我已经看到了一些类似的例子,但我对语言的了解还不够,还不知道我做错了什么。我已经拼凑了一个演示来了解更多信息,但我在植入数据库时遇到了问题 我收到以下错误: InvalidOperationException:无法从根提供程序解析作用域服务“demoApp.Models.AppDbContext” Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteValidator.ValidateResolution(类型

关于这一点,我已经看到了一些类似的例子,但我对语言的了解还不够,还不知道我做错了什么。我已经拼凑了一个演示来了解更多信息,但我在植入数据库时遇到了问题

我收到以下错误:

InvalidOperationException:无法从根提供程序解析作用域服务“demoApp.Models.AppDbContext”

Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteValidator.ValidateResolution(类型serviceType,ServiceProvider ServiceProvider)

以下是有问题的三个文件:

模型/AppDbContext.cs

public class AppDbContext : DbContext
{
    public AppDbContext(DbContextOptions<AppDbContext> options) : base(options)
    {

    }
    public DbSet<Product> Products{ get; set; }
    public DbSet<Category> Categories { get; set; }
}
public static class DbInitializer
{
    public static void Seed(IApplicationBuilder applicationBuilder)
    {
        //I'm bombing here
        AppDbContext context = applicationBuilder.ApplicationServices.GetRequiredService<AppDbContext>();

        if (!context.Products.Any())
        {
            // Add range of products
        }

        context.SaveChanges();
    }

    private static Dictionary<string, Category> _categories;
    public static Dictionary<string, Category> Categories
    {
        get
        {
            if (_categories == null)
            {
               // Add categories...
            }

            return _categories;
        }
    }
}
public Startup(IConfiguration configuration)
{
    Configuration = configuration;
}

public IConfiguration Configuration { get; }

public void ConfigureServices(IServiceCollection services)
{
    services.AddTransient<ICategoryRepository, CategoryRepository>();
    services.AddTransient<IProductRepository, ProductRepository>();

    services.AddDbContext<AppDbContext>(options => 
        options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

    services.AddMvc();
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
        app.UseBrowserLink();
        app.UseStatusCodePages();
        
        // Kersplat!
        DbInitializer.Seed(app);
    }
    else ...
    
    app.UseStaticFiles();
    app.UseMvc(routes => {...});
}
    public static void Seed(IApplicationBuilder applicationBuilder)
    {
        using (var serviceScope = applicationBuilder.ApplicationServices.GetRequiredService<IServiceScopeFactory>()
                .CreateScope())
        {
            AppDbContext context = serviceScope.ServiceProvider.GetService<AppDbContext>();

            if (!context.Products.Any())
            {
                // Seed Here
            }

            context.SaveChanges();
        }
    }
公共类AppDbContext:DbContext
{
公共AppDbContext(DbContextOptions选项):基本(选项)
{
}
公共数据库集产品{get;set;}
公共数据库集类别{get;set;}
}
型号/DBInitializer.cs

public class AppDbContext : DbContext
{
    public AppDbContext(DbContextOptions<AppDbContext> options) : base(options)
    {

    }
    public DbSet<Product> Products{ get; set; }
    public DbSet<Category> Categories { get; set; }
}
public static class DbInitializer
{
    public static void Seed(IApplicationBuilder applicationBuilder)
    {
        //I'm bombing here
        AppDbContext context = applicationBuilder.ApplicationServices.GetRequiredService<AppDbContext>();

        if (!context.Products.Any())
        {
            // Add range of products
        }

        context.SaveChanges();
    }

    private static Dictionary<string, Category> _categories;
    public static Dictionary<string, Category> Categories
    {
        get
        {
            if (_categories == null)
            {
               // Add categories...
            }

            return _categories;
        }
    }
}
public Startup(IConfiguration configuration)
{
    Configuration = configuration;
}

public IConfiguration Configuration { get; }

public void ConfigureServices(IServiceCollection services)
{
    services.AddTransient<ICategoryRepository, CategoryRepository>();
    services.AddTransient<IProductRepository, ProductRepository>();

    services.AddDbContext<AppDbContext>(options => 
        options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

    services.AddMvc();
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
        app.UseBrowserLink();
        app.UseStatusCodePages();
        
        // Kersplat!
        DbInitializer.Seed(app);
    }
    else ...
    
    app.UseStaticFiles();
    app.UseMvc(routes => {...});
}
    public static void Seed(IApplicationBuilder applicationBuilder)
    {
        using (var serviceScope = applicationBuilder.ApplicationServices.GetRequiredService<IServiceScopeFactory>()
                .CreateScope())
        {
            AppDbContext context = serviceScope.ServiceProvider.GetService<AppDbContext>();

            if (!context.Products.Any())
            {
                // Seed Here
            }

            context.SaveChanges();
        }
    }
公共静态类DbInitializer
{
公共静态无效种子(IAApplicationBuilder applicationBuilder)
{
//我正在轰炸这里
AppDbContext上下文=applicationBuilder.ApplicationServices.GetRequiredService();
如果(!context.Products.Any())
{
//增加产品范围
}
SaveChanges();
}
私有静态字典_类;
公共静态词典类别
{
得到
{
如果(_categories==null)
{
//添加类别。。。
}
返回(u)类别;;
}
}
}
Startup.cs

public class AppDbContext : DbContext
{
    public AppDbContext(DbContextOptions<AppDbContext> options) : base(options)
    {

    }
    public DbSet<Product> Products{ get; set; }
    public DbSet<Category> Categories { get; set; }
}
public static class DbInitializer
{
    public static void Seed(IApplicationBuilder applicationBuilder)
    {
        //I'm bombing here
        AppDbContext context = applicationBuilder.ApplicationServices.GetRequiredService<AppDbContext>();

        if (!context.Products.Any())
        {
            // Add range of products
        }

        context.SaveChanges();
    }

    private static Dictionary<string, Category> _categories;
    public static Dictionary<string, Category> Categories
    {
        get
        {
            if (_categories == null)
            {
               // Add categories...
            }

            return _categories;
        }
    }
}
public Startup(IConfiguration configuration)
{
    Configuration = configuration;
}

public IConfiguration Configuration { get; }

public void ConfigureServices(IServiceCollection services)
{
    services.AddTransient<ICategoryRepository, CategoryRepository>();
    services.AddTransient<IProductRepository, ProductRepository>();

    services.AddDbContext<AppDbContext>(options => 
        options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

    services.AddMvc();
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
        app.UseBrowserLink();
        app.UseStatusCodePages();
        
        // Kersplat!
        DbInitializer.Seed(app);
    }
    else ...
    
    app.UseStaticFiles();
    app.UseMvc(routes => {...});
}
    public static void Seed(IApplicationBuilder applicationBuilder)
    {
        using (var serviceScope = applicationBuilder.ApplicationServices.GetRequiredService<IServiceScopeFactory>()
                .CreateScope())
        {
            AppDbContext context = serviceScope.ServiceProvider.GetService<AppDbContext>();

            if (!context.Products.Any())
            {
                // Seed Here
            }

            context.SaveChanges();
        }
    }
公共启动(IConfiguration配置)
{
配置=配置;
}
公共IConfiguration配置{get;}
public void配置服务(IServiceCollection服务)
{
services.AddTransient();
services.AddTransient();
services.AddDbContext(选项=>
options.UseSqlServer(Configuration.GetConnectionString(“DefaultConnection”));
services.AddMvc();
}
公共无效配置(IApplicationBuilder应用程序,IHostingEnvironment环境)
{
if(env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseBrowserLink();
app.UseStatusCodePages();
//路虎!
DbInitializer.Seed(app);
}
其他的
app.UseStaticFiles();
app.UseMvc(routes=>{…});
}

有人能帮我解释一下我做错了什么以及如何补救这种情况吗?

更新原始答案:

对于.NETCore2.0,请改为签出

原始答案:

我也不是.NET核心专家,但这可能是您的解决方案

DBInitializer.cs中

public class AppDbContext : DbContext
{
    public AppDbContext(DbContextOptions<AppDbContext> options) : base(options)
    {

    }
    public DbSet<Product> Products{ get; set; }
    public DbSet<Category> Categories { get; set; }
}
public static class DbInitializer
{
    public static void Seed(IApplicationBuilder applicationBuilder)
    {
        //I'm bombing here
        AppDbContext context = applicationBuilder.ApplicationServices.GetRequiredService<AppDbContext>();

        if (!context.Products.Any())
        {
            // Add range of products
        }

        context.SaveChanges();
    }

    private static Dictionary<string, Category> _categories;
    public static Dictionary<string, Category> Categories
    {
        get
        {
            if (_categories == null)
            {
               // Add categories...
            }

            return _categories;
        }
    }
}
public Startup(IConfiguration configuration)
{
    Configuration = configuration;
}

public IConfiguration Configuration { get; }

public void ConfigureServices(IServiceCollection services)
{
    services.AddTransient<ICategoryRepository, CategoryRepository>();
    services.AddTransient<IProductRepository, ProductRepository>();

    services.AddDbContext<AppDbContext>(options => 
        options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

    services.AddMvc();
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
        app.UseBrowserLink();
        app.UseStatusCodePages();
        
        // Kersplat!
        DbInitializer.Seed(app);
    }
    else ...
    
    app.UseStaticFiles();
    app.UseMvc(routes => {...});
}
    public static void Seed(IApplicationBuilder applicationBuilder)
    {
        using (var serviceScope = applicationBuilder.ApplicationServices.GetRequiredService<IServiceScopeFactory>()
                .CreateScope())
        {
            AppDbContext context = serviceScope.ServiceProvider.GetService<AppDbContext>();

            if (!context.Products.Any())
            {
                // Seed Here
            }

            context.SaveChanges();
        }
    }
公共静态无效种子(IAApplicationBuilder applicationBuilder)
{
使用(var serviceScope=applicationBuilder.ApplicationServices.GetRequiredService()
.CreateScope())
{

AppDbContext context=serviceScope.ServiceProvider.GetService doc,但更具体地说,是该节。

在ASP.NET Core 2.0中,建议进行以下更改。(startup.cs中的种子设定适用于Core 1.x。对于2.0,进入Program.cs,在应用程序启动时修改Main方法以执行以下操作: 从依赖项注入容器获取数据库上下文实例。 调用seed方法,将上下文传递给它。 在种子方法完成时处置上下文。 (以下是来自Microsoft网站的示例。)

publicstaticvoidmain(字符串[]args)
{
var host=BuildWebHost(args);
使用(var scope=host.Services.CreateScope())
{
var services=scope.ServiceProvider;
尝试
{
var context=services.GetRequiredService();

DbInitializer.Seed(上下文);//我重新运行迁移,按预期更新了数据库和数据库种子。我非常感谢您提供的链接。非常感谢。您是最棒的,谢谢!为什么要修改
Main
?是否有任何引用提到这是首选的?它在上面代码下方的链接文章中提到。“在以前的教程中,您可能会在Startup.cs中的Configure方法中看到类似的代码。我们建议您仅在设置请求管道时使用Configure方法。应用程序启动代码属于Main方法。“注意:需要以下using语句才能使用CreateScope方法:
使用Microsoft.Extensions.DependencyInjection;
。更新的链接: