EF Core 1.1 - .netコアコンソールに移行を追加する方法

.net-core entity-framework-core

質問

私のソリューションには以下の2つのプロジェクトがあります:

  • Sample.UI"dotnet new"によって作成されたdotnetコアコンソールプロジェクト。
  • Sample.Infrastruction : "dotnet new -t lib"で作成されたdotnetコアライブラリで、BlogDbContextがそこにあります。

私がdotnet ef --startup-project ..\sample.ui migrations add InitialDBを実行しようとすると、 dotnet ef --startup-project ..\sample.ui migrations add InitialDBSample.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プロバイダー)

Microsoft.Extensions.DependencyInjection.ServiceProvider。<> c__DisplayClass16_0.b__0(ServiceProviderプロバイダ)

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(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(アクションアクション)

問題を修正するためにAddDbContextを追加しようとしましたが、私のためには機能しませんでした。たぶん私は内蔵のDIを正しく使用していないでしょう。私はたくさんのGoogle検索を行っていますが、ほとんどのソリューションは、ドットネットコンソールではなくasp.netコアに使用されています。


参考までに、 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"

受け入れられた回答

EFコアの移行を行う際に、ほとんどのコモンズ間違いを避けるには、次のようにします

  1. コマンドで明示的にプロジェクトパラメータを記述する
    --startup-project <StartProject> 、あなたのケースのSample.UI
    --project <ContextProject> 、これはあなたのDBContextが残すプロジェクト、あなたのケースのSample.Infrastructureです

  2. 移行はで動作するpublic default constructorまたはIDbContextFactoryデフォルトはデフォルトコンストラクタを使用している場合absent.Soある場合は、上書きする必要がありますOnConfiguringのようなもの、あなたのコンテキストクラスに

public class BlogDbContext: DbContext 
{
   public DbSet<Blog> Blogs { get; set; }
   protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
   {
     string connStr = ConfigurationManager.ConnectionStrings["YourConnName"].ConnectionString;
     optionsBuilder.UseSqlite(connStr);
   }
}

代わりに、あなたのIDbContextFactoryがある同じプロジェクトにIDbContextFactoryを実装することができます

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

人気のある回答

--projectとしてSample.Infrascrutureを追加する必要があり--project 。このような:

dotnet ef --project "C:\MYPATH\Sample.Infrastructure" --startup-project "C:\MYPATH\Sample.UI" migrations add "TXT"

そしてそれをSample.UIプロジェクトから実行します

database upgradeするときも同じです

また、 BlogDbContext connectionstringを設定しようとしBlogDbContext

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


Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ