我已在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,当手动测试是否使数据库脱机时,它会立即失败。
我测试错了吗?还是缺少正确设置的内容?
答案 0 :(得分:1)
Jeroen Mostert在评论中回答了这个问题
如果通过“使数据库脱机”实际上是指设置 数据库状态为OFFLINE,预计会失败-不是一个 弹性可预防的条件,因为它不是暂时的 这种状况很可能会及时解决。如果服务器 已启动,但数据库已显式设置为脱机,您将立即 将其作为错误返回-如果需要,可以添加重试 到您的应用程序。要测试连接弹性,您必须 关闭服务器本身-即关闭SQL Server(或防火墙端口 1433,效果相同。)
偶然地,errorNumbersToAdd属性应允许您标记 如果需要,将“数据库脱机”作为暂时性错误-错误 数字是942。仅在生产中也有意义时才使用 -否则,为了进行测试,添加自定义RAISERROR的错误编号50000(例如,RAISERROR(' 错误!',11,0)),这很容易插入查询中。不要用那个 当然也可以在生产中使用,因为大多数自定义错误都不应 盲目重试-使用像Polly这样的东西更有意义 为此。
这似乎是最好的解释。