【问题标题】:Entity Framework Core and UseInMemoryDatabase实体框架核心和 UseInMemoryDatabase
【发布时间】:2020-05-10 16:54:02
【问题描述】:

我正在尝试使用 Entity Framework Core UseInMemoryDatabase 编写测试,因此我的设置如下所示:

    [SetUp]
    public void Setup()
    {
        this.ContextOptions = new DbContextOptionsBuilder<GeneralContext>()
            .UseInMemoryDatabase(databaseName: "DiagAc2Tests")
            .Options;
    }

我不知道是否需要,但上下文看起来像:

public class GeneralContext : DbContext
{
    public DbSet<Entities.Application> Applications { get; set; }
    public GeneralContext() { }
    public GeneralContext(DbContextOptions<GeneralContext> options) : base(options) { }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        var config = new DatabaseConfiguration();
        optionsBuilder.UseNpgsql(config.GetConnectionString());
    }
}

我在整个应用程序中都使用这个上下文并且它可以工作,所以我的测试看起来像:

        public async Task CreateApplicationByService()
        {
            Mock<DTO.IApplication> mock = new Mock<DTO.IApplication>();
            mock.SetupProperty(f => f.Name, "Application");
            mock.SetupProperty(f => f.ProjectId, 666);
            mock.SetupProperty(f => f.ConfigFilePath, null);

            DTO.IApplication appDto = mock.Object;

            var entity = this.Mapper.Map<DTO.IApplication, Application>(appDto);
            try
            {
                using var context = new GeneralContext(this.ContextOptions);
                await context .ApplicationRepository.Add(entity);
            }
            catch (Exception ex)
            {
                var t = ex;
            }

            var one = 1;
            var two = 2;
            Assert.True(one != two);
        }

我没有任何断言,这就是为什么添加了那个愚蠢的断言,但是当我通过上下文添加记录时,我得到了:

数据库提供程序“Microsoft.EntityFrameworkCore.InMemory”、“Npgsql.EntityFrameworkCore.PostgreSQL”的服务已在服务提供程序中注册。在服务提供者中只能注册一个数据库提供者。如果可能,请确保实体框架通过删除对 UseInternalServiceProvider 的调用来管理其服务提供者。否则,请考虑有条件地注册数据库提供者,或为每个数据库提供者维护一个服务提供者。

我都是按照 MSDN 上的文档做的,有什么不对吗?

【问题讨论】:

    标签: .net-core entity-framework-core


    【解决方案1】:
    optionsBuilder.UseNpgsql(config.GetConnectionString());
    

    错误在这一行,这是控制反转的一个例子。你不应该在OnConfiguring. 中调用UseNpqSql 这样做是它试图使用2 个数据库。

    this.ContextOptions = new DbContextOptionsBuilder<GeneralContext>()
            .UseInMemoryDatabase(databaseName: "DiagAc2Tests")
            .Options;
    
    optionsBuilder.UseNpgsql(config.GetConnectionString());
    

    以上两个语句都会运行。

    现在解决这个问题的方法是将 UseNpgsql 移到配置之外和你的应用启动类中。这当然取决于您的项目以及您希望如何实现它。

    【讨论】:

      【解决方案2】:

      在测试项目中,您可以使用与您的应用程序不同的 Startup 类,并且您可以从测试项目中的 Startup 类中删除 UseNpgsql,因为您想使用 In Memory 数据库。

      【讨论】:

        猜你喜欢
        • 2021-07-14
        • 1970-01-01
        • 1970-01-01
        • 2016-08-29
        • 2017-04-03
        • 2020-09-12
        • 2020-06-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多