【问题标题】:Instantiate Npgsql.EntityFrameworkCore.PostgreSQL's DbContext directly直接实例化 Npgsql.EntityFrameworkCore.PostgreSQL 的 DbContext
【发布时间】:2019-08-26 17:30:55
【问题描述】:

我使用 Npgsql.EntityFrameworkCore.PostgreSQL 创建了一个 EF Core DbContext。我想在单元测试项目的测试用例中实例化这个 DbContext。不是创建实际的单元测试,而是尝试使用此 DbContext 操作 postgresql 数据库。

由于这不是一个 ASP.NET Core 项目,所以没有依赖注入,也没有 AddEntityFrameworkNpgsql / AddDbContext 扩展方法。

我检查了documentation,找不到这样做的示例。

那么,如何直接实例化这个 DbContext?

【问题讨论】:

    标签: c# entity-framework-core npgsql


    【解决方案1】:

    原来UseNpgsql扩展方法可以在这里使用:

    using Xunit;
    using Microsoft.EntityFrameworkCore;
    using System.Linq;
    
    namespace MyTestProject
    {
        public class DbContextTest
        {
            [Fact]
            public void ActualQuery()
            {
                var optionsBuilder = new DbContextOptionsBuilder<MyDbContext>()
                    .UseNpgsql("Host=mypgsvr;Database=mydb;Username=myusr;Password=mypass");
                var SUT = new MyDbContext(optionsBuilder.Options);
    
                var firstRow = SUT.mytable.First();
    
                Assert.NotNull(firstRow);
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

      执行此操作的标准方法是简单地在您的 DbContext 上创建一个接受连接字符串的构造函数,或者一个无参数构造函数并在内部执行连接字符串查找(例如,通过 Microsoft.Extension.Configuration)。使用 DbContextOptionsBuilder 对于这种用途来说是不必要的繁重。

      参见the EF Core docs for regular .NET Core applications,与通常使用依赖注入的 ASP.NET 应用程序相反。

      【讨论】:

      • 这个人自己哇! :) 顺便说一句,感谢 Npgsql。我宁愿不更改 DbContext 的构造函数,因为我确实在带有依赖注入的 asp.net 核心应用程序中使用它。
      • 感谢您的好话 :) 拥有两个构造函数应该没问题 - 一个用于 ASP.NET,一个用于测试 - 但按照您的建议构建您的选项也很好。跨度>
      猜你喜欢
      • 2021-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-25
      • 1970-01-01
      • 2018-02-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多