SuperAPI AI 工具集

ef-core-azure-sql

数据与分析

查看项目

更新于 10-16 00:31

技能介绍

用途:这是 EF Core 针对 Azure SQL Database 的差异补充,而非 EF Core 教程;建模、LINQ、变更跟踪与 Include 等通用内容不在此重复。连接级重试由 connect-to-azure-sql 负责,本技能负责其上的 EF Core 执行策略与事务语义。

主要能力:说明重试在 Azure SQL 上默认开启。EnableRetryOnFailure 与较新的 UseAzureSql 都会产生 SqlServerRetryingExecutionStrategy,并重新定义事务:重试使单元可重复执行,而非更健壮;提交确认窗口内的瞬时故障会导致委托重放,可能静默写入第二行且不抛异常、不记日志。还说明防护手段:唯一幂等键加唯一索引;strategy.ExecuteInTransactionAsync 配 verifySucceeded 谓词,并须保留 acceptAllChangesOnSuccess: false,随后 AcceptAllChanges;仅在单元本身可安全重复时才用裸 CreateExecutionStrategy().Execute 包装。

使用方式:EF Core 9 起可用 options.UseAzureSql(connectionString, o => o.UseCompatibilityLevel(170));无法改动的 UseSqlServer 场景可用 options.ConfigureSqlEngine(c => c.EnableRetryOnFailureByDefault()),UseAzureSqlDefaults(true) 已过时。重试参数为默认值而非覆盖值,可按实测调整。EF Core 10 下 UseAzureSql 默认兼容级别 170,会把 JSON 的 nvarchar(max) 映射为原生 json 列,升级须先执行 dotnet ef migrations add、migrations script 并检查 ALTER。

检查项:dotnet ef dbcontext info 应显示 EngineType=AzureSql;dotnet ef migrations has-pending-model-changes 期望退出码 0;查询 sys.indexes 确认幂等键索引 is_unique=1。

限制与注意:不要假设 Database.BeginTransaction 会抛异常,它本身成功,随后查询或 SaveChanges 才抛;原始 SQL 不受保护。不要为消除异常而关闭重试,也不要让重试预算超过调用方超时。索引起始字符串若无 MaxLength 会被收窄为 nvarchar(450),超长触发 Msg 2628。不要无条件添加 AsSplitQuery,也不要从应用启动迁移云数据库。Azure SQL 无时区选择,GETDATE() 等同 SYSUTCDATETIME()。