Entity Framework Core 1.0 连接字符串

2024-05-07

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

  1. DTO
  2. 存储库(实体框架 - 代码优先)
  3. 服务(业务逻辑)
  4. MVC(UI-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 迁移添加和 dotnet ef 数据库更新)。

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

  protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) {

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

  }

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

问题:上面提到的堆栈是我们用于多个“微型应用程序”的堆栈,这意味着我们有多个连接到多个数据库的项目。我们还希望利用开发、登台和生产连接字符串。

如果我们使用配置管理器连接字符串,那么日常操作一切都很好;但是,当我们想要将实体框架代码用于数据库命令行时,我们需要进入要更新的每个存储库并将 DbContext 更改为硬编码连接字符串,执行命令,然后将它们更改回完成时的状态,这就变得相当麻烦了。

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

任何方向将不胜感激!


EF Core 旨在通过依赖项注入进行配置。依赖注入使您的 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。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Entity Framework Core 1.0 连接字符串 的相关文章

随机推荐

  • 根据 HTTP PATCH RFC,文档的部分表示是否是有效的“更改集”?

    这是什么RFC 5789 https www rfc editor org rfc rfc5789 says PATCH 方法请求将请求实体中描述的一组更改应用于由 Request URI 标识的资源 这组更改以称为 补丁文档 的格式表示
  • 如何从命令行提供非 slurpy 数组或命名数组?

    首先 raku perl6 非常棒 克罗也是如此 只花了一个周末就坠入爱河 然而现在我偶然发现了一些非常简单的事情 如果我在多重调度 MAIN 中使用 slurpy 参数 则会被识别并完美运行 multi MAIN config add h
  • 如何随时暂停 pthread?

    最近我开始将 ucos ii 移植到 Ubuntu PC 上 我们知道 在pthread的回调函数中的 while 循环中简单地添加一个标志来执行暂停和恢复是不可能模拟ucos ii中的 进程 的 如下解决方案 因为ucos ii中的 进程
  • Python 3.7 Windows 不支持 dbm.gnu 吗?

    做的时候 import dbm gnu 在适用于 Windows 的标准 Python 3 7 6 64 上 我得到 文件 C Python37 lib dbm gnu py 第 3 行 位于从 gdbm 导入 ModuleNotFound
  • XSL。评估表达

    对不起我的英语不好 XSL 1 0 如何从元素或属性值计算表达式 例如 XML
  • 在 Protractor 测试中同步处理

    我正在尝试在量角器中编写一个我认为相当简单的测试 但似乎当您尝试同步执行任何操作时 量角器就会让您的生活变得困难 通常 处理定位器函数 返回 Promise 不是问题 因为任何 Expect 语句都会在测试断言之前自动解析传递给它的任何 P
  • 在 OS X 10.7.4 上安装 RSRuby 时找不到库

    我正在尝试在我的 Mac 上安装 RSRuby 调用后 sudo gem install rsruby 我收到此错误 ERROR Cannot find the R library aborting extconf rb failed Co
  • 插入标准模式文档中的动态 iframe 默认为怪异模式

    我有一份当前正在返回的父文档CSS1Compat from document compatMode 当我使用 jQuery 添加一个空白 iframe 时 如下所示 body append 并检查新 iframe 的 compatMode
  • 从java程序调用SVN命令

    我想从 java 程序调用 SVN 命令 update commit 有什么帮助吗 SVN 乌龟SVN 环境 java程序将在jBoss服务器内运行 从应用程序服务器内使用 GUI SVN 客户端是一个非常非常糟糕的主意 而Tortoise
  • 服务器端生成的 Excel 中出现 System.Runtime.InteropServices.COMException 错误

    我们有一个 Web 应用程序 可以生成 Excel 电子表格并在服务器端运行宏 然后它通过电子邮件将它们发送给不同的人 它是传统报告风格的一部分 我们正在对其进行转换 但仍然支持我们作为 IIS 中的网站提供的新应用程序 我知道进行 Off
  • 发布后忽略基本标签

    在 Chrome 上我收到错误Refused to execute a JavaScript script Source code of script found within request 在发布包含域名的数据后 另请注意任一页面上都缺
  • Openshift 上的自定义 Node.js 版本

    我在运行自定义节点版本时遇到问题node0 10您可以在开放班次中找到墨盒here https github com DavidReinberger openshift meteor leaderboard customNode 我可以很好
  • 视频回退到 Flash 在 Firefox 中不起作用

    我一直在审查有关开发人员向其 HTML5 网站添加 Flash 后备的不同方式的材料 我有这个带有虚拟视频的测试代码
  • 故事板中的 Xcode 6 UIVisualEffectView

    我正在 Xcode 6 中的对象库中查找 UIVisualEffectView 以在 Storyboard 中添加模糊效果 我知道如何以编程方式执行此操作 但我找不到在故事板中执行此操作的方法 这在当前的测试版中是否不可用 或者有没有一种不
  • Python 字符串到 SQL IN 参数的列表

    我在 python 中有这个查询 ssim group S1200 S1300 query select WIPMessageCnt from waferdata where recipename in s and equipment an
  • Django 全文搜索优化 - Postgres

    我正在尝试利用 Django v2 1 和 Postgres 9 5 创建一个地址自动完成功能的全文搜索 但性能目前不适合自动完成 我不明白逻辑我得到的绩效结果背后 就信息而言 该表相当大 有 1400 万行 我的型号 from djang
  • 将outer()应用于两个列表

    我有一个清单 说exm list elm1 c a b elm2 c b c d elm3 c b c d e 我想对以下两个元素的每个组合应用一个函数exm e g length intersect exm elm1 exm elm2 结
  • Android 开发应用程序密钥和应用程序秘密

    我正在尝试使用带氦气选项的城市飞艇为 Android 应用程序设置推送通知 但是 我需要为我的应用程序找到这些信息 但我不知道从哪里可以找到 任何意见或建议将不胜感激 谢谢你 For setting up Helium make sure
  • Tkinter - 打开一个窗口并关闭另一个窗口

    我想要一个登录屏幕 当登录成功时 屏幕将关闭并创建一个新屏幕 问题是 当我执行以下代码时 两个屏幕同时打开 如果您有任何改进代码的建议 请提出 from Tkinter import import mysql connector impor
  • Entity Framework Core 1.0 连接字符串

    我们正在开发一个非常大的 ASP NET Core MVC 1 0 应用程序 我们的每个应用程序都有 4 层 如下所示 DTO 存储库 实体框架 代码优先 服务 业务逻辑 MVC UI MVC 目前 在我们处理所有数据库操作的存储库中 我们