C# ASP.NET核心2种子数据库
关于这一点,我已经看到了一些类似的例子,但我对语言的了解还不够,还不知道我做错了什么。我已经拼凑了一个演示来了解更多信息,但我在植入数据库时遇到了问题 我收到以下错误: InvalidOperationException:无法从根提供程序解析作用域服务“demoApp.Models.AppDbContext” Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteValidator.ValidateResolution(类型serviceType,ServiceProvider ServiceProvider) 以下是有问题的三个文件: 模型/AppDbContext.csC# 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(类型
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;
。更新的链接: