【发布时间】:2021-07-05 16:02:05
【问题描述】:
我在使用 Entity Framework Core 5 和 ASP.NET Core 5 API 中的“始终加密”功能时遇到问题。我已配置 Azure Key Vault 并根据需要更新了连接字符串。我可以成功读取加密列数据,代码如下:
await using var context = new RcContext();
Company c = await context.Companies.FindAsync(id);
Companies 表有一个加密列。加密列在数据库中定义为数据类型varchar(16),并在实体的字符串成员中以纯文本形式返回。
但是,尝试使用 context.SaveChanges() 更新公司或插入新公司会失败。我得到了错误
SqlException:操作数类型冲突:使用 ... 加密的 nvarchar(4000) 与使用 ... 加密的 varchar(16) 不兼容
解决这个问题的一些建议是使用SqlClient 中的SqlCommand 或存储过程,或者将数据库中的列大小增加到nvarchar(max)。
EF Core 是否无法使用普通的SaveChanges() 模式更新具有始终加密列的 SQL Server 中的数据?如何使用 EF Core 进行这项工作?
【问题讨论】:
-
在您的实体类中,相关字段是否用
[Column(TypeName="varchar(16)")]装饰?错误消息听起来像是当前用[MaxLength(4000)]装饰。 -
实体类型是POCO,没有装饰。加密列是一个字符串。只是为了测试,我将数据库中的加密列更改为
nvarchar(max)类型,context.SaveChanges()现在可以使用。但是,我认为我不能采用这种解决方案。
标签: sql-server entity-framework-core savechanges always-encrypted