下面是我安装的包的列表:Installed Packages
我使用的是Entityframework核心2.0。我第一次使用实体框架代码优先迁移(add-migration和update-database命令)成功地创建了数据库。现在,当我更新我的实体并尝试运行迁移时,它给出了以下错误。
无法创建类型为“DataContext”的对象。将“IDesignTimeDbContextFactory”的实现添加到项目中,或查看https://go.microsoft.com/fwlink/?linkid=851728以了解设计时支持的其他模式。
这是我的代码。
Program.cs
public static void Main(string[] args)
{
BuildWebHost(args).Run();
}
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.Build();Startup.cs
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
// Repositories
services.AddMvc();
services.AddDbContextPool<DataContext>(
options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
//options => options.UseSqlServer(@"Server=LAPTOP-518D8067;Database=Gyanstack;Trusted_Connection=True;MultipleActiveResultSets=true"));
services.AddCors();
services.AddScoped<ISectionRepository, SectionRepository>();
services.AddScoped(typeof(IEntityBaseRepository<>), typeof(EntityBaseRepository<>));
}DataContext.cs
public class DataContext : DbContext
{
public DataContext(DbContextOptions<DataContext> options)
: base(options)
{ }
public DbSet<Section> Section { get; set; }
public DbSet<SubSection> SubSection { get; set; }
public DbSet<Article> Article { get; set; }
public DbSet<Comment> Comment { get; set; }
public DbSet<User> User { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.AddConfiguration(new SectionMap());
modelBuilder.AddConfiguration(new SubSectionMap());
modelBuilder.AddConfiguration(new ArticleMap());
modelBuilder.AddConfiguration(new CommentMap());
}
}发布于 2017-08-27 21:07:01
编辑:现在已过时。Microsoft updated their migration document在9月底向您展示了如何更新,因此您不需要此解决方法。
如此issue I raised on github所示,您将DB初始化代码移动到Program main,将其放在BuildWebHost()和.Run()之间。
一旦您理解了需要在Main中使用var context = services.GetRequiredService<MyContext>();获取DB上下文,这就相对容易了,然后一切都会按预期工作。(虽然我仍然认为DB初始化是一次性初始化的事情,而不是每个程序运行的事情)
发布于 2017-11-09 19:07:27
简单地更改了我的Program.cs
从这里开始
public class Program
{
public static void Main(string[] args)
{
var host = new WebHostBuilder()
.UseKestrel()
.UseContentRoot(Directory.GetCurrentDirectory())
.UseIISIntegration()
.UseStartup<Startup>()
.Build();
host.Run();
}
}到这个
public class Program
{
public static void Main(string[] args)
{
BuildWebHost(args).Run();
}
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.Build();
}来源:https://wildermuth.com/2017/07/06/Program-cs-in-ASP-NET-Core-2-0
发布于 2017-10-05 20:47:01
在2.0项目中,将SeedData.Initialize调用移动到Program.cs的Main方法
var host = BuildWebHost(args);
using (var scope = host.Services.CreateScope())
{
var services = scope.ServiceProvider;
try
{
SeedData.Initialize(services, "").Wait();
}
catch (Exception ex)
{
var logger = services.GetRequiredService<ILogger<Program>>();
logger.LogError(ex, "An error occurred seeding the DB.");
}
}
host.Run(); 参考:https://docs.microsoft.com/en-us/aspnet/core/migration/1x-to-2x/#move-database-initialization-code
https://stackoverflow.com/questions/45892312
复制相似问题