在.NET core 2.0中创建迁移步骤时,将“IDesignTimeDbContextFactory <servicesdbcontext>”的实现添加到项目错误中

时间:2018-02-15 11:14:06

标签: c# .net .net-2.0 ef-migrations

我有一个.NET核心1.0 webapp正常工作。我不得不升级到.NET Core 2.0。我还必须为我的SQLite数据库添加一个迁移步骤。

如果我启动此命令:

  

添加迁移MyMigrationStepName

我收到此错误:

  

无法创建“ServicesDbContext”类型的对象。添加一个   'IDesignTimeDbContextFactory'的实现   该项目,或参见https://go.microsoft.com/fwlink/?linkid=851728   在设计时支持其他模式。

我在SO以及其他博客和网站上看到了很多答案,但是没有人真正说明在哪里实现这样的界面以及具体方法应该包含哪些代码!

3 个答案:

答案 0 :(得分:5)

<强>示例

public class ApplicationDbContext : IdentityDbContext
{
    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options) { }
}

public class ApplicationContextDbFactory : IDesignTimeDbContextFactory<ApplicationDbContext>
{
    ApplicationDbContext IDesignTimeDbContextFactory<ApplicationDbContext>.CreateDbContext(string[] args)
    {
        var optionsBuilder = new DbContextOptionsBuilder<ApplicationDbContext>();
        optionsBuilder.UseSqlServer<ApplicationDbContext>("Server = (localdb)\\mssqllocaldb; Database = MyDatabaseName; Trusted_Connection = True; MultipleActiveResultSets = true");

        return new ApplicationDbContext(optionsBuilder.Options);
    }
}

位置

将该类放在ApplicationDbContext的放置位置。当您使用dotnet ef cli命令时,它将自动被选中。

答案 1 :(得分:1)

IDesignTimeDbContextFactory&lt;&gt; 问题的可能解决方案是在添加迁移过程中发现/启动DBContext。 添加迁移需要获取上下文。如果它不能,则抛出此错误。 如果您没有公共参数DBContext,则会发生这种情况。 因此,解决方案是在上下文中添加公共无参数构造函数。

public  class SomeDbContext: DbContext
{
    // this PUBLIC constructor  is required for Migration tool
    public SomeDbContext()
    {

    }
  // the model...
    public DbSet<PocoBla> PocoBlas { get; set; }
    ....
 }

您可以在单独的项目.netCore控制台项目中使用特殊版本的DBContext,以便生成迁移代码。

答案 2 :(得分:1)

我只需将Program.cs更新为最新的.NET Core 2.x模式即可解决此问题:

从1.x开始:

using System.IO; using Microsoft.AspNetCore.Hosting;

namespace AspNetCoreDotNetCore1App {
    public class Program
    {
        public static void Main(string[] args)
        {
            var host = new WebHostBuilder()
                .UseKestrel()
                .UseContentRoot(Directory.GetCurrentDirectory())
                .UseIISIntegration()
                .UseStartup<Startup>()
                .UseApplicationInsights()
                .Build();

            host.Run();
        }
    } }

至2.x:

using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;

namespace AspNetCoreDotNetCore2App
{
    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://docs.microsoft.com/en-us/ef/core/miscellaneous/cli/dbcontext-creation