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

时间:2017-05-23 09:16:31

标签: c# entity-framework linq always-encrypted

我遇到问题,总是加密以与Entity Framework一起玩。

我的目标是.Net 4.6.1,在我的连接字符串中启用了Column Encryption Setting=Enabled,我可以成功拨打电话并使用

接收解密的内容
var results = dbContext.EncryptedTable.ToList()

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

DbContext具有

的CodeFirst支持
Property(x => x.EncryptedColumn)
    .HasColumnName("EncryptedColumn").IsRequired().IsUnicode(false);

一旦我开始在我的dbContext上使用includes,事情开始变坏。

这有效

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

这会引发错误: 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);

在2个电话中执行SQL配置文件可以看到第2个电话在exec sp_describe_parameter_encryption的呼叫失败。

这种情况是否支持EF并且始终加密?

1 个答案:

答案 0 :(得分:0)

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

您可能需要将查询重新整理为2个查询,以避免使用并集。 [对不起语法错误]