C# 实体框架核心2.0.0在不同项目中的迁移

C# 实体框架核心2.0.0在不同项目中的迁移,c#,.net-core,entity-framework-core,C#,.net Core,Entity Framework Core,我有两个项目 1) .NetCore控制台应用程序 Microsoft.EntityFrameworkCore.Tools 2.0.0 Microsoft.EntityFrameworkCore.SqlServer 2.0.0 Microsoft.Extensions.Configuration.Json 2.0.0 我有一个入口点 class Program { private static IConfiguration Configuration { get; set; }

我有两个项目

1) .NetCore控制台应用程序

  • Microsoft.EntityFrameworkCore.Tools 2.0.0
  • Microsoft.EntityFrameworkCore.SqlServer 2.0.0
  • Microsoft.Extensions.Configuration.Json 2.0.0
我有一个入口点

class Program
{
    private static IConfiguration Configuration { get; set; }

    static void Main(string[] args)
    {
        IConfigurationRoot configurationRoot = new ConfigurationBuilder()
            .AddJsonFile($"appsettings.json", true, true)
            .Build();

        Configuration = configurationRoot;

        // create service collection
        var serviceCollection = new ServiceCollection();
        ConfigureServices(serviceCollection);

        // create service provider
        serviceCollection.BuildServiceProvider();
    }

    private static void ConfigureServices(ServiceCollection serviceCollection)
    {
        string connectionString = Configuration.GetConnectionString("DefaultConnection");
        serviceCollection.AddDbContext<MyDbContext>(options => options.UseSqlServer(connectionString));
    }
}
2) .NetStandard Lib(包含DbContext)

  • Microsoft.EntityFrameworkCore 2.0.0
  • Microsoft.EntityFrameworkCore.Tools 2.0.0
  • Microsoft.EntityFrameworkCore.SqlServer 2.0.0
我希望能够使用
dotnet ef migrations add[NAME]
创建一个迁移脚本,并且我已经确定了如果在lib文件夹中运行该命令,我可以针对一个启动项目来运行迁移

D:\Lib>dotnet ef迁移添加InitialCreate-s..\ConsoleApp\

我通过在MyDbContext的同一文件夹中添加一个类实现了
IDesignTimeDbContextFactory
我可以添加一个连接字符串,它运行得非常好,从而实现了这一点

public class MyDbContextFactory : IDesignTimeDbContextFactory<MyDbContext>
{
    public MyDbContext CreateDbContext(string[] args)
    {
        DbContextOptionsBuilder<MyDbContext> builder = new DbContextOptionsBuilder<MyDbContext>();
        builder.UseSqlServer("****", optionsBuilder => optionsBuilder.MigrationsAssembly(typeof(MyDbContext).GetTypeInfo().Assembly.GetName().Name));
        return new MyDbContext(builder.Options);
    }
}
公共类MyDbContextFactory:IDesignTimeDbContextFactory
{
公共MyDbContext CreateDbContext(字符串[]args)
{
DbContextOptionsBuilder=新的DbContextOptionsBuilder();
builder.UseSqlServer(“****”,optionsBuilder=>optionsBuilder.MigrationsAssembly(typeof(MyDbContext).GetTypeInfo().Assembly.GetName().Name));
返回新的MyDbContext(builder.Options);
}
}
我的问题是我想从内部使用连接字符串 控制台应用程序的appsettings.json

有可能吗?我怎么做


提前谢谢。

好的,我想我有一个解决方案,不过我不确定我是否满意

我的program.cs现在是:

class Program
{
    static void Main(string[] args)
    {
    }
}
我将实现
IDesignTimeDbContextFactory
的类从带有MyDbContext的项目移动到控制台应用程序,现在看起来像:

public class MyDbContextFactory : IDesignTimeDbContextFactory<MyDbContext>
{
    public MyDbContext CreateDbContext(string[] args)
    {
        IConfiguration configuration = new ConfigurationBuilder()
            .AddJsonFile("appsettings.json", true, true)
            .Build();

        string connectionString = configuration.GetConnectionString("DefaultConnection");

        DbContextOptionsBuilder<MyDbContext> builder = new DbContextOptionsBuilder<MyDbContext>();
        builder.UseSqlServer(connectionString,
            optionsBuilder => optionsBuilder.MigrationsAssembly(typeof(MyDbContext).GetTypeInfo().Assembly.GetName().Name));
        return new MyDbContext(builder.Options);
    }
}
公共类MyDbContextFactory:IDesignTimeDbContextFactory
{
公共MyDbContext CreateDbContext(字符串[]args)
{
IConfiguration configuration=new ConfigurationBuilder()
.AddJsonFile(“appsettings.json”,true,true)
.Build();
string connectionString=configuration.GetConnectionString(“DefaultConnection”);
DbContextOptionsBuilder=新的DbContextOptionsBuilder();
builder.UseSqlServer(connectionString,
optionsBuilder=>optionsBuilder.MigrationsAssembly(typeof(MyDbContext).GetTypeInfo().Assembly.GetName().Name));
返回新的MyDbContext(builder.Options);
}
}
因此,控制台应用程序是:

  • program.cs
  • MyDbContextFactory.cs
我正在运行的命令仍然有效

D:\Lib>dotnet ef迁移添加InitialCreate-s..\ConsoleApp\

我无法删除Microsoft.EntityFrameworkCore.SqlServer上的引用,因为迁移脚本已保存到lib项目,并且具有对库的引用。如果我将迁移脚本转移到另一个文件夹,这意味着我可以删除依赖项,但我现在可以接受

public class MyDbContextFactory : IDesignTimeDbContextFactory<MyDbContext>
{
    public MyDbContext CreateDbContext(string[] args)
    {
        IConfiguration configuration = new ConfigurationBuilder()
            .AddJsonFile("appsettings.json", true, true)
            .Build();

        string connectionString = configuration.GetConnectionString("DefaultConnection");

        DbContextOptionsBuilder<MyDbContext> builder = new DbContextOptionsBuilder<MyDbContext>();
        builder.UseSqlServer(connectionString,
            optionsBuilder => optionsBuilder.MigrationsAssembly(typeof(MyDbContext).GetTypeInfo().Assembly.GetName().Name));
        return new MyDbContext(builder.Options);
    }
}