.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就在这里
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核心迁移时出现大多数常见错误,请执行以下操作
--启动项目
--project
公共默认构造函数
或IDbContextFactory
(如果没有默认构造函数)。因此,如果使用默认构造函数,您必须在上下文类中重写配置
,类似于要避免执行EF核心迁移时出现大多数常见错误,请执行以下操作
--启动项目
--project
公共默认构造函数
或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);
}
}