【问题标题】:Updating/inserting into a table with Always Encrypted columns using EF Core 5使用 EF Core 5 更新/插入包含 Always Encrypted 列的表
【发布时间】: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


【解决方案1】:

使用 Always Encrypted,SQL 客户端需要知道列的大小,以便它可以在客户端上进行加密。所以列的属性必须如下:

[Column(TypeName = "varchar(16)")] public string PaymentCreditCard { get; set; }

我只需要对加密列进行归属,而不是每一列。在这项工作之前,我们的源库没有使用数据注释,我不清楚它们是否是始终加密工作的必需

【讨论】:

  • 在我的情况下,列的长度与数据库中指定的不同,但这个答案为我指明了正确的方向。看起来配置文件也有效:builder.Property(x => x.Email).HasMaxLength(250);
猜你喜欢
  • 1970-01-01
  • 2020-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-24
相关资源
最近更新 更多