我们如何在Entity Framework Core中测试连接弹性

时间:2019-04-23 15:03:46

标签: sql-server entity-framework-core

我已在Entity Framework Core中打开了连接弹性:

services.AddDbContext<MyDbContext>( options =>
    options.UseSqlServer(Configurations["ConnectionString"]),
    sqlServerOptionsAction: sqlOptions =>
    {
        sqlOptions.EnableRetryOnFailure(
        maxRetryCount: 10,
        maxRetryDelay: TimeSpan.FromSeconds(5),
        errorNumbersToAdd: null);
    });

现在,我想创建一些单元测试来证明它确实有效。 可以做这样的事情吗?

InMemoryDbContext似乎没有EnableRetryOnFailure方法,而我能找到的最相似的测试是在EF6中: https://thedatafarm.com/data-access/testing-out-the-connection-resiliency-feature-into-ef6/

(这有点复杂)

作为其他一些信息,我正在使用SQL Server 2017和Entity Framework Core 2.2.0,当手动测试是否使数据库脱机时,它会立即失败。

我测试错了吗?还是缺少正确设置的内容?

1 个答案:

答案 0 :(得分:1)

Jeroen Mostert在评论中回答了这个问题

如果通过“使数据库脱机”实际上是指设置 数据库状态为OFFLINE,预计会失败-不是一个 弹性可预防的条件,因为它不是暂时的 这种状况很可能会及时解决。如果服务器 已启动,但数据库已显式设置为脱机,您将立即 将其作为错误返回-如果需要,可以添加重试 到您的应用程序。要测试连接弹性,您必须 关闭服务器本身-即关闭SQL Server(或防火墙端口 1433,效果相同。)

偶然地,errorNumbersToAdd属性应允许您标记 如果需要,将“数据库脱机”作为暂时性错误-错误 数字是942。仅在生产中也有意义时才使用 -否则,为了进行测试,添加自定义RAISERROR的错误编号50000(例如,RAISERROR(' 错误!',11,0)),这很容易插入查询中。不要用那个 当然也可以在生产中使用,因为大多数自定义错误都不应 盲目重试-使用像Polly这样的东西更有意义 为此。

这似乎是最好的解释。