【发布时间】:2021-09-06 09:56:19
【问题描述】:
长话短说,过去几天我们一直在创建翻译,以将密钥解密/加密添加到实体框架中。
以下选择有效(硬编码键“test”仅用于测试环境,稍后将与密钥库一起存储) EF.Functions.Decrypt 触发一个翻译表达式,它为实体框架编写自定义 SQL 以利用内部解密方法。
var filteredSet = Set.Include(x => x.Table2)
.Where(x => x.Id == id)
.Where(x => x.Table2.IsSomething)
.Select(m => new Model
{
Id = m.Id,
Decrypted = EF.Functions.Decrypt("test", m.Encrypted), //string
Table2 = m.Table2,
Encrypted = m.Encrypted //byte[]
}).ToList();
以下内容(正如我所预料的那样)没有。
public Model createNew(string Data)
{
Set.Add(
new Model
{
Encrypted = EF.Functions.Encrypt("test", Data)
}
);
return new Model();
}
当以这种方式使用时,它会尝试使用 EF 函数创建新模型对象并抛出 InvalidOperationError。 有没有办法在 EF 中执行 Add in 来转换此函数,而不是尝试将代码执行到模型中?
【问题讨论】:
-
无法通过 EF Core 的更改跟踪器实现。只能通过第三方扩展。
-
你知道任何扩展吗?或有关他们如何完成它的任何文档?
-
问题是在创建/更新/删除实体时不涉及表达式,而
EF.Functions只是在表达式中仅有意义的函数调用的占位符。外部表达式他们没有实现。正如 Svyaloslav 所指出的,EF 的变更跟踪器无法处理它,它只能处理设定值。也就是说,我喜欢这里的开箱即用的想法。我认为 EF可以提供一个 API 用于将函数注入 CUD 查询,但问题是他们是否会在这样的功能中看到足够的附加值。
标签: c# reflection entity-framework-core asp.net-core-mvc translation