gpt4 book ai didi

entity-framework-migrations - 带有配置的类库中的 Entity Framework 7 迁移脚手架

转载 作者:行者123 更新时间:2023-12-03 22:34:16 27 4
gpt4 key购买 nike

尝试向位于 ASP.NET 5 类库中的 EF7 模型添加迁移。运行时 dnx . ef migration add mymigration根据我在哪个项目上运行它,失败并产生不同的结果。

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

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

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

最佳答案

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

If I run it in the folder of the shared project, it does not have access to the connection string specified in the startup.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(或者您通过用户 secret 或环境变量添加它。)您的 config.json 可能如下所示:
{
"ConnectionStrings": {
"MyDbContext": "Some-Connection-String"
}
}

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

I have gleaned from questions like this that it does work from the shared project if you specify the connection string in the OnConfiguring method of the DbContext but I really would like to keep this code separate from the configuration.



数据库上下文

如果我上面的假设是正确的,那么您可以访问 DbContext 中的连接字符串通过使用您在 Startup 中使用的相同模式类(class)。也就是说,在 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 连接字符串的内容,那么您可以改用环境变量或用户 secret 。

关于entity-framework-migrations - 带有配置的类库中的 Entity Framework 7 迁移脚手架,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30868968/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com