如何在asp.net-core-2.0中向项目添加'IDesignTimeDbContextFactory <DataContext>'的实现

M J*_*M J 22 c# entity-framework-core asp.net-core-2.0

以下是我安装的软件包列表:已安装的软件包

我正在使用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();
Run Code Online (Sandbox Code Playgroud)

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<>));
}
Run Code Online (Sandbox Code Playgroud)

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());
    }
}
Run Code Online (Sandbox Code Playgroud)

gbj*_*anb 14

编辑:现在已经过时了.Microsoft 在9月底更新了他们的迁移文档,以显示如何更新,因此您不需要此解决方法.

正如我在github提到的这个问题所示,你将数据库初始化代码移到Program main,将它放在BuildWebHost()和.Run()之间

一旦你理解了你需要var context = services.GetRequiredService<MyContext>();在Main 中使用DB上下文然后一切都按预期工作,它相对容易 .(虽然我仍然认为DB初始化是一次性初始化的事情,而不是每个程序运行的东西)


小智 6

只需更改我的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();
  }
}
Run Code Online (Sandbox Code Playgroud)

对此

public class Program
{
  public static void Main(string[] args)
  {
    BuildWebHost(args).Run();
  }

  public static IWebHost BuildWebHost(string[] args) =>
      WebHost.CreateDefaultBuilder(args)
          .UseStartup<Startup>()
          .Build();
}
Run Code Online (Sandbox Code Playgroud)

资料来源:https://wildermuth.com/2017/07/06/Program-cs-in-ASP-NET-Core-2-0