【发布时间】:2017-06-06 23:39:17
【问题描述】:
我的解决方案中有两个项目如下:
- Sample.UI:由“dotnet new”创建的 dotnet core 控制台项目。
- Sample.Infrastruction:由“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, ServiceProvider provider)
在 Microsoft.Extensions.DependencyInjection.ServiceProvider.c__DisplayClass16_0.b__0(ServiceProvider 提供者)
在 Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider provider, Type serviceType)
在 Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService[T](IServiceProvider 提供者)
在 Microsoft.EntityFrameworkCore.Design.Internal.DesignTimeServicesBuilder.Build(DbContext 上下文)
在 Microsoft.EntityFrameworkCore.Design.Internal.MigrationsOperations.AddMigration(String name, String outputDir, String contextType)
在 Microsoft.EntityFrameworkCore.Design.OperationExecutor.AddMigrationImpl(String name, String outputDir, String contextType)
在 Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.c__DisplayClass3_0`1.b__0()
在 Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.Execute(Action 动作)
我已尝试添加 AddDbContext 来解决此问题,但对我不起作用。也许我没有正确使用内置 DI。我搜索了很多,但大多数解决方案都用于 asp.net 核心而不是 dotnet 控制台。
以下是Sample.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);
}
}
}
Sample.UI源代码:
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();
}
}
}
更新
我也尝试过@Morten 的解决方案,在 Sample.UI 文件夹中执行以下命令。但是,我得到了完全相同的错误。
dotnet ef --project "C:\SampleDDD\Sample.Infrastructure" --startup-project "C:\SampleDDD\Sample.UI" migrations add "InitalDB"
【问题讨论】:
标签: .net-core entity-framework-core