.net core EF Core 1.1-如何在.net Core控制台中添加迁移

.net core EF Core 1.1-如何在.net Core控制台中添加迁移,.net-core,entity-framework-core,.net Core,Entity Framework Core,我的解决方案中有两个项目,如下所示: Sample.UI:由“dotnet new”创建的dotnet核心控制台项目 Sample.infrastructure:一个由“dotnet new-t lib”创建的dotnet核心库,BlogDbContext就在这里 当我尝试在sample.Infrastructure文件夹中运行dotnet ef--startup project..\sample.ui migrations add InitialDB时,它引发了一个错误: 尚未为此DbCo

我的解决方案中有两个项目,如下所示:

  • Sample.UI:由“dotnet new”创建的dotnet核心控制台项目
  • Sample.infrastructure:一个由“dotnet new-t lib”创建的dotnet核心库,BlogDbContext就在这里
当我尝试在sample.Infrastructure文件夹中运行
dotnet ef--startup project..\sample.ui migrations add InitialDB
时,它引发了一个错误:

尚未为此DbContext配置任何数据库提供程序。可以通过重写上的DbContext.On来配置提供程序 在应用程序服务提供程序上使用AddDbContext配置方法或。如果使用了AddDbContext,那么还要确保DbContext类型在其构造函数中接受DbContextOptions对象,并将其传递给DbContext的基本构造函数

错误堆栈信息:

在Microsoft.EntityFrameworkCore.Internal.DatabaseProviderSelector.SelectServices()中 在Microsoft.EntityFrameworkCore.Internal.LazyRef1.get_Value()中

位于Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.Vis itScoped(ScopedCallSite ScopedCallSite,服务提供商)

在Microsoft.Extensions.DependencyInjection.ServiceProvider.c\u DisplayClass16\u 0.b\u 0(ServiceProvider provider)

位于Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider提供程序,键入serviceType)

位于Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService[T](IServiceProvider提供程序)

位于Microsoft.EntityFrameworkCore.Design.Internal.DesignTimeServicesBuilder.Build(DbContext上下文)

位于Microsoft.EntityFrameworkCore.Design.Internal.MigrationsOperations.AddMigration(字符串名称、字符串输出目录、字符串上下文类型)

位于Microsoft.EntityFrameworkCore.Design.OperationExecutor.AddMigrationImpl(字符串名称、字符串输出目录、字符串上下文类型)

在Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.c__DisplayClass3_0`1.b__0()中

位于Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.Execute(操作)

我曾尝试添加AddDbContext来解决此问题,但对我无效。也许我没有正确使用内置DI。我在谷歌上搜索了很多,但大多数解决方案都是用于asp.net核心,而不是用于dotnet控制台


以下是示例。Infrastructure源代码,供您参考:

namespace Sample.Infrastructure
{
    public class BlogDbContext : DbContext
    {
        public BlogDbContext(DbContextOptions<BlogDbContext> options)
            : base(options)
        {

        }

        public BlogDbContext()
        {
             //ATT: I also don't understand why ef requires the parameterless constructor
        }

        public DbSet<Blog> Blogs { get; set; }

        protected override void OnModelCreating(ModelBuilder builder)
        {
            builder.Entity<Blog>().HasKey(post => post.Identity);
            base.OnModelCreating(builder);
        }
    }
}
namespace Sample.UI
{
    public class Program
    {
        static public IConfigurationRoot Configuration { get; set; }
        private static IServiceProvider _serviceProvider;

        public static void Main(string[] args)
        {
            var builder = new ConfigurationBuilder()
                .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);
            Configuration = builder.Build();

            //setup DI
            _serviceProvider = new ServiceCollection()
                .AddDbContext<BlogDbContext>(o=> o.UseSqlite(Configuration["ConnectionString"]))
                .BuildServiceProvider();

            // PostApplicationService app = new PostApplicationService();
            // var ctx = _serviceProvider.GetService(typeof(BlogDbContext)) as BlogDbContext;   
            // app.Inital(ctx);

            Console.ReadLine();
        }
    }
}

您需要将
Sample.Infrascruture
添加为
--project
。像这样:

dotnet ef --project "C:\MYPATH\Sample.Infrastructure" --startup-project "C:\MYPATH\Sample.UI" migrations add "TXT"
然后从
Sample.UI
项目运行它

当您执行
数据库升级时也是如此

另外,尝试在
BlogDbContext

 protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
 {
     optionsBuilder.UseSqlServer("Server=.;Database=MYDB;Integrated Security=True");
 }

您需要将
Sample.Infrascruture
添加为
--project
。像这样:

dotnet ef --project "C:\MYPATH\Sample.Infrastructure" --startup-project "C:\MYPATH\Sample.UI" migrations add "TXT"
然后从
Sample.UI
项目运行它

当您执行
数据库升级时也是如此

另外,尝试在
BlogDbContext

 protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
 {
     optionsBuilder.UseSqlServer("Server=.;Database=MYDB;Integrated Security=True");
 }

要避免执行EF核心迁移时出现大多数常见错误,请执行以下操作

  • 在命令中显式写入项目参数
    --启动项目,示例中的Sample.UI
    --project,这是DBContext离开的项目,在您的例子中是Sample.Infrastructure

  • 迁移使用
    公共默认构造函数
    IDbContextFactory
    (如果没有默认构造函数)。因此,如果使用默认构造函数,您必须在上下文类中重写
    配置
    ,类似于


  • 要避免执行EF核心迁移时出现大多数常见错误,请执行以下操作

  • 在命令中显式写入项目参数
    --启动项目,示例中的Sample.UI
    --project,这是DBContext离开的项目,在您的例子中是Sample.Infrastructure

  • 迁移使用
    公共默认构造函数
    IDbContextFactory
    (如果没有默认构造函数)。因此,如果使用默认构造函数,您必须在上下文类中重写
    配置
    ,类似于


  • 我试过你的方法,但也犯了同样的错误。你这样做成功了吗?@Charley是的,我就是这样做的。我在这个问题上花了几个小时。我已经更新了这个问题,以包含一些错误堆栈信息。以及对您的解决方案的反馈。你能帮我看一下吗?如果你还需要别的,请告诉我information@Charley请参阅我的最新答案。此外,尝试删除无参数构造函数BlogDbContextyeah,此解决方案可以成功添加迁移,但我不想在dbContext中硬编码DB信息,因为我希望Sample.UI决定将使用哪种DB,例如SqlServer、SQLite、etcI尝试了您的方法,但它引发了相同的错误。你这样做成功了吗?@Charley是的,我就是这样做的。我在这个问题上花了几个小时。我已经更新了这个问题,以包含一些错误堆栈信息。以及对您的解决方案的反馈。你能帮我看一下吗?如果你还需要别的,请告诉我information@Charley请参阅我的最新答案。此外,请尝试删除无参数构造函数BlogDbContextyeah,此解决方案可以成功添加迁移,但我不想在dbContext中硬编码DB信息,因为我希望Sample.UI决定将使用哪种DB,例如SqlServer、SQLite、etcThanks@nsb,我喜欢工厂解决方案。它不会污染我的BlogDbContext.optionsBuilder.UseSqlite(配置[“ConnectionString]”);不再工作了。请更新tasks@nsb,我喜欢工厂解决方案。它不会污染环境
    public class YourFactory : IDbContextFactory<BlogDbContext>
    {
        public BlogDbContextCreate()
        {
            var optionsBuilder = new DbContextOptionsBuilder<BlogDbContext>();
            string connStr = ConfigurationManager.ConnectionStrings["YourConnName"].ConnectionString;
            optionsBuilder.UseSqlite(connStr);
    
            return new BlogDbContext(optionsBuilder.Options);
        }
    }