11

尝试将迁移添加到位于 ASP.NET 5 类库中的 EF7 模型。当运行dnx . ef migration add mymigration失败时,结果会有所不同,具体取决于我在哪个项目上运行它。

如果我在主项目的文件夹中运行它,它找不到 a DbContext,这是有道理的,因为DbContextis 在共享项目中,而 ef 命令可能不关心依赖关系。

如果我在共享项目的文件夹中运行它,它无权访问 startup.cs 中指定的连接字符串。我从这样的问题中收集到,如果OnConfiguring您在 的方法中指定连接字符串,它确实可以从共享项目中工作,DbContext但我真的想将此代码与配置分开。

我在 EF7 存储库中遇到了一些问题日志,其中提到他们实现了用于指定项目和上下文的命令行选项,但没有示例,我无法通过查看提交历史记录中的源代码来弄清楚如何使用它.

4

1 回答 1

10

这是一种可能对您有用的方法。

如果我在共享项目的文件夹中运行它,它无权访问 startup.cs 中指定的连接字符串。

启动.cs

我假设在您的 Startup.cs 中,您通过访问Configuration而不是硬编码来指定连接字符串。此外,我假设在您的 Startup.cs 文件的构造函数中,您正在从几个来源设置配置。换句话说,您的 Startup.cs 可能看起来像这样:

public class Startup
{
    public IConfiguration Config { get; set; }

    public Startup(IHostingEnvironment env)
    {
        var config = new Configuration()
            .AddJsonFile("config.json")
            .AddUserSecrets()
            .AddEnvironmentVariables();

        Config = config;
    }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddEntityFramework()
            .AddSqlServer()
            .AddDbContext<MyDbContext>(options =>
            {
                options.UseSqlServer(Config["ConnectionStrings:MyDbContext"]);
            });
    }

    public void Configure(IApplicationBuilder app, IServiceProvider serviceProvider)
    {
        var db = serviceProvider.GetRequiredService<MyDbContext>();
        db.Database.AsSqlServer().EnsureCreated();

        app.Run(async (context) =>
        {
            await context.Response.WriteAsync("Hello World!");
        });
    }
}

配置文件

此外,我假设您正在将连接字符串添加到项目根目录中的 config.json 中(或者您通过用户机密或环境变量添加它。)您的 config.json 可能如下所示:

{
  "ConnectionStrings": {
    "MyDbContext": "Some-Connection-String"
  }
}

如果您不这样做,则可能值得尝试。

我从这样的问题中收集到,如果您在 DbContext 的 OnConfiguring 方法中指定连接字符串,它确实可以从共享项目中工作,但我真的希望将此代码与配置分开。

数据库上下文

如果我上面的假设是正确的,那么您可以使用您在课堂DbContext上使用的相同模式来访问连接字符串。Startup也就是说,在DbContext构造函数中,设置IConfiguration. 然后,在 中OnConfiguring,访问连接字符串。它可能看起来像这样:

public class MyDbContext : DbContext
{
    protected override void OnModelCreating(ModelBuilder builder)
    {
        builder.Entity<SomeModel>().Key(e => e.Id);
        base.OnModelCreating(builder);
    }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        var connString = Config["ConnectionStrings:MyDbContext"];
        optionsBuilder.UseSqlServer(connString);
    }

    public IConfiguration Config { get; set; }

    public MyDbContext()
    {
        var config = new Configuration()
            .AddJsonFile("config.json")
            .AddEnvironmentVariables();

        Config = config;
    }
}

项目结构

当然,您还需要在共享项目文件夹的根目录中有一个 config.json 文件。因此,您的项目结构可能如下所示:

SharedDataContext
    Migrations
    config.json
    project.json

WebApp
    config.json
    project.json
    Startup.cs

在上面,两个 config.json 文件都包含一个连接字符串设置DbContext

一些想法

如果您不喜欢复制 config.json 连接字符串的内容,那么您可以使用环境变量或用户机密。

于 2015-06-17T02:12:45.917 回答