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,当我手动测试时,如果我使数据库脱机,它会立即失败。
我是不是测试错了,或者我错过了正确设置的东西?
解决方案
Jeroen Mostert 在评论中回答了这个问题:
如果通过“使数据库脱机”,您的字面意思是将数据库状态设置为 OFFLINE,则预期会发生故障——这不是弹性防范的条件之一,因为它不是很可能会及时自行解决的瞬态条件。如果服务器已启动但数据库显式设置为脱机,您将立即将其作为错误返回 - 如果需要,是否添加重试取决于您的应用程序。要测试连接弹性,您必须关闭服务器本身——即关闭 SQL Server(或防火墙端口 1433,效果相同)。
顺便说一句,errorNumbersToAdd 属性应该允许您将“数据库处于脱机状态”标记为暂时性错误,如果需要的话——错误号是 942。只有在生产中也有意义时才使用它——否则,为了测试,它添加 50000 更有意义,自定义 RAISERROR 的错误号(例如 RAISERROR('This is a transient error!', 11, 0)),很容易在查询中注入。当然,也不要在生产中使用它,因为大多数自定义错误不应该盲目重试——使用 Polly 之类的东西更有意义。
这似乎是最好的解释。
推荐阅读
- python - 在 Python 中使用变量查找 Json 键
- java - 用于屏蔽 xml 标记内容中除最后 4 位以外的数字的字符串的正则表达式
- linux - 我怎样才能拥有一个核心转储而不来自 gdb 的程序?
- java - Firebase数据库检索值,这可能吗
- mysql - DataTables 警告:表 id=seo_editor_product - 无效的 JSON 响应
- connector - 为 Xero API 创建 Power BI 自定义连接器
- go - 快速方法按距离搜索数百万个坐标
- python-3.x - 来自另一个数据帧的 Python DataFrame 多行过滤
- powershell - IE导航到本地文件时找不到基于HWND的iexplorer进程?
- c# - C# Y Datagridview