Add an implementation of 'IDesignTimeDbContextFactory' to the project error while creating a migration step in .NET core 2.0

后端 未结 3 833
無奈伤痛
無奈伤痛 2020-12-18 06:51

I had a .NET core 1.0 webapp working fine. I had to upgrade to .NET Core 2.0. I also had to add a migration step for my SQLite database.

If I launch this command:

相关标签:
3条回答
  • 2020-12-18 07:19

    A possible solution to IDesignTimeDbContextFactory<> problem is the DBContext discovery/launch during the add-migration process. Add migrations needs to get a context. If it cant, this error is thrown. This can happen if you do not have a public parameter-less DBContext. So a solution is to Add a public Parameter-less constructor to your context.

    public  class SomeDbContext: DbContext
    {
        // this PUBLIC constructor  is required for Migration tool
        public SomeDbContext()
        {
    
        }
      // the model...
        public DbSet<PocoBla> PocoBlas { get; set; }
        ....
     }
    

    You can have a special version of your DBContext in a separate project .netCore console project for migration code generation purposes.

    0 讨论(0)
  • 2020-12-18 07:25

    I solve the problem by simply updating Program.cs to the latest .NET Core 2.x pattern:

    From 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();
            }
        } }
    

    To 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();
        }
    }
    

    Source: https://docs.microsoft.com/en-us/ef/core/miscellaneous/cli/dbcontext-creation

    0 讨论(0)
  • 2020-12-18 07:43

    Sample:

    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);
        }
    }
    

    Location:

    Put that class where the ApplicationDbContext is put. It will then be automatically picked up when you use dotnet ef cli commands.

    0 讨论(0)
提交回复
热议问题