始终使用Entity Framework加密并且包含无法实现查询

Luk*_*kie 8 c# linq entity-framework always-encrypted

我遇到的问题是始终加密以与Entity Framework一起玩得很好.

我正在瞄准.Net 4.6.1,已启用Column Encryption Setting=Enabled我的连接字符串,我可以成功拨打电话并使用接收解密的内容

var results = dbContext.EncryptedTable.ToList()
Run Code Online (Sandbox Code Playgroud)

EncryptedTable有1列使用确定性加密,数据类型为Varchar(Max).

DbContext有CodeFirst支持

Property(x => x.EncryptedColumn)
    .HasColumnName("EncryptedColumn").IsRequired().IsUnicode(false);
Run Code Online (Sandbox Code Playgroud)

一旦我开始使用包含在我的dbContext上的东西开始变坏.

这有效

var id = Guid.Parse("123-456-789");
var result = dbContext
    .TableA
    .Include(x => x.EncryptedTable)
    .FirstOrDefault(x => x.id == id);
Run Code Online (Sandbox Code Playgroud)

抛出错误: Operand type clash: varchar is incompatible with varchar(max) encrypted with (encryption_type = 'DETERMINISTIC', encryption_algorithm_name = 'AEAD_AES_256_CBC_HMAC_SHA_256',

var id = Guid.Parse("123-456-789");
var result = dbContext.TableA
    .Include(x => x.TableB)
    .Include(x => x.EncryptedTable)
    .FirstOrDefault(x => x.id == id);
Run Code Online (Sandbox Code Playgroud)

在2个调用中执行SQL配置文件可以看到第2个调用失败exec sp_describe_parameter_encryption.

EF是否支持此方案并始终加密?

小智 0

您上次查询不起作用的原因是始终加密功能不支持复杂查询。Union 是使用 EF include 语法(对于一对多关系)时出现的不受支持的语法之一。

您可能需要将查询重新加工为 2 个查询,以避免使用联合。[抱歉,有任何语法错误]