SQL Server 2019升级后EF用Always Encrypted遇安全飞地报错的解决方法
解决方案
1. 清除执行计划缓存
错误提示明确指向执行计划缓存问题,迁移后SQL Server可能留存了错误尝试调用飞地功能的旧计划。执行以下操作:
- 连接到SQL Server实例,执行命令清除目标数据库的缓存:
若需要清除整个实例的缓存(需注意影响所有数据库),执行:-- 先获取目标数据库ID SELECT DB_ID('Derma2Go_test'); -- 替换<数据库ID>为上述查询结果,清除单个数据库的执行计划缓存 DBCC FLUSHPROCINDB (<数据库ID>);DBCC FREEPROCCACHE;
2. 修改连接字符串,显式禁用飞地
在现有连接字符串中添加Enclave Attestation Url=(空值),明确告知客户端驱动不使用安全飞地功能。修改后的连接字符串:
Data Source=localhost\SQLEXPRESS;Initial Catalog=Derma2Go_test;Integrated Security=True;MultipleActiveResultSets=True;Column Encryption Setting=enabled;Enclave Attestation Url=
3. 更新EF6及SqlClient依赖
你使用的EF6 6.0.0.0版本较旧,可能存在与SQL Server 2019 Always Encrypted的兼容性问题:
- 将Entity Framework 6更新至最新稳定版本(如6.4.4)
- 更新
System.Data.SqlClientNuGet包到4.8.5及以上版本
4. 确认密钥未启用飞地支持
检查加密列关联的密钥配置,确保未开启飞地计算:
- 在SSMS中展开目标数据库 → 安全性 → 始终加密密钥
- 查看列主密钥属性,确认“允许飞地计算”未勾选
- 检查列加密密钥,确认未关联启用飞地的列主密钥
内容的提问来源于stack exchange,提问作者Eduardo Correal
相关产品推荐
相关产品推荐

