gpt4 book ai didi

c# - Entity Framework Core 1.0 连接字符串

转载 作者:可可西里 更新时间:2023-11-01 08:16:58 24 4
gpt4 key购买 nike

我们正在开发一个大型的 ASP.NET Core MVC 1.0 应用程序。我们的每个应用程序都有 4 层,如下所示:

  1. DTO
  2. 存储库( Entity Framework - 代码优先)
  3. 服务(业务逻辑)
  4. MVC(用户界面-MVC)

目前,在我们处理所有数据库操作的存储库中,我们已将数据库连接字符串硬编码在 DbContext 中,如下所示:

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) {

optionsBuilder.UseSqlServer("Data Source=somedatabase.database.windows.net;Initial Catalog=database;Integrated Security=False;User ID=username;Password=password;Connect Timeout=60;Encrypt=True;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False;MultipleActiveResultSets=true");

}

该项目作为独立的 ASP.NET Core 1.0 项目在 MVC 项目之外。它还有一个空的 Program.cs 文件,似乎需要执行代码到数据库的命令行(dotnet ef migrations add 和 dotnet ef database update)。

我们在 DbConext 中使用硬编码连接字符串的原因是,当我们使用以下代码时,在执行 dotnet ef 命令时,我们得到一个对象引用未设置为对象异常的实例。

  protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) {

optionsBuilder.UseSqlServer(ConfigurationManager.ConnectionStrings["StandardDatabase"].ConnectionString);

}

但是,由于我们有 Program.cs,如果我们为连接字符串添加 Debug.WriteLine 并运行项目,它会返回正确的连接字符串,如果我们在 appsettings.json 文件中设置连接字符串UI,UI 也将成功连接。

问题:上面提到的堆栈是我们用于几个“微应用程序”的堆栈,这意味着我们有几个连接到多个数据库的项目。我们还想利用 Development、Staging 和 Production 连接字符串。

如果我们使用 Configuration Manager Connection String,对于日常操作来说一切都很好;然而,当我们想要将 Entity Framework 代码用于数据库命令行时,我们需要进入我们想要更新的每个存储库并将 DbContext 更改为硬编码连接字符串,执行命令,然后在完成后将它们更改回,这就变得很麻烦了。

问题:我们是否做错了,是否有设置 Entity Framework Core 1.0 堆栈的首选做法,使我们不必手动更改 DbContext,而是全面利用配置文件?

任何方向将不胜感激!

最佳答案

EF Core 旨在通过依赖注入(inject)进行配置。依赖注入(inject)使您的 DbContext 保持干净,并且独立于环境的实现细节。

您最初的硬编码连接字符串解决方案将 DbContext 与数据库所在位置的知识紧密耦合。这显然是个问题。但是您提出的解决方案将 DbContext 与特定配置文件的知识紧密结合在一起。这也是一个问题。

要使 DbContext 独立于环境细节,请创建一个构造函数,该构造函数采用 DbContextOptions 参数并调用基类构造函数。

public class MyContext : DbContext
{
public MyContext(DbContextOptions options) :
base(options)
{
}
}

执行此操作而不是覆盖 OnConfiguring。然后在宿主应用程序的 Startup.cs 中对其进行初始化。这就是配置文件的知识所在。

public class Startup
{
private IConfigurationRoot _configuration;

public Startup(IHostingEnvironment env)
{
_configuration = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json")
.Build();
}

public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<IConfigurationRoot>(_configuration);

services.AddDbContext<MyContext>(options => options
.UseSqlServer(_configuration.GetConnectionString("MyContext")));
}
}

现在您可以从任何地方使用您的 DbContext。

关于c# - Entity Framework Core 1.0 连接字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38982387/

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