次のように私の溶液中の二つのプロジェクトがあります:EFコア1.1 - .NETコアコンソールで移行を追加する方法
- Sample.UI作成者:DOTNETコアコンソールプロジェクト「dotnetに新しいです」 。
- Sample.Infrastruction: "dotnet new -t lib"で作成されたdotnetコアライブラリで、BlogDbContextがそこにあります。
No database provider has been configured for this DbContext. A provider can be configured by overriding the DbContext.On Configuring method or by using AddDbContext on the application service provider. If AddDbContext is used, then also ensure that your DbContext type accepts a DbContextOptions object in its constructor and passes it to the base constructor for DbContext
エラー・スタック情報を:
at Microsoft.EntityFrameworkCore.Internal.DatabaseProviderSelector.SelectServices() at Microsoft.EntityFrameworkCore.Internal.LazyRef1.get_Value()
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.Vis itScoped(ScopedCallSite scopedCallSite, ServiceProvider provider)
at Microsoft.Extensions.DependencyInjection.ServiceProvider.<>c__DisplayClass16_0.b__0(ServiceProvider provider)
at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider provider, Type serviceType)
at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService[T](IServiceProvider provider)
at Microsoft.EntityFrameworkCore.Design.Internal.DesignTimeServicesBuilder.Build(DbContext context)
at Microsoft.EntityFrameworkCore.Design.Internal.MigrationsOperations.AddMigration(String name, String outputDir, String contextType)
at Microsoft.EntityFrameworkCore.Design.OperationExecutor.AddMigrationImpl(String name, String outputDir, String contextType)
at Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.<>c__DisplayClass3_0`1.b__0()
at Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.Execute(Action action)
私が試してみました私はSample.Infrastructureフォルダに
dotnet ef --startup-project ..\sample.ui migrations add InitialDB
を実行しようとすると、それはエラーが発生した
問題を解決するためにAddDbContextを追加しますが、私のためには機能しませんでした。たぶん私は内蔵のDIを正しく使用していないでしょう。私はたくさんのGoogle検索を行っていますが、ほとんどのソリューションは、ドットネットコンソールではなくasp.netコアに使用されています。
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ソースコード:あなたの参考のため
は、以下Sample.Infrastructureソースコードである
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"
ありがとう@nsb、私はファクトリのソリューションが好きです。私のBlogDbContextは汚染されません。 – Charlie
optionsBuilder.UseSqlite(Configuration ["ConnectionString"]);もう動作しません。更新してください –