在 Entity Framework 5 中的添加期间是否可以使用 EF 函数转换?

Is it possible to use EF Function Translation during an Add in Entity Framework 5?

长话短说,过去几天我们一直在创建一个翻译,以通过按键将 decrypt/encrypt 添加到 Entity Framework。

以下 select 有效(硬编码密钥“test”仅用于测试环境,稍后将与密钥库一起存储) EF.Functions.Decrypt 触发翻译表达式,为 Entity Framework 编写自定义 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 中执行添加,它会翻译此函数而不是尝试将代码执行到模型中?

由于目前没有将Expression Tree传递给EF Core ChangeTracker的解决方案,可以试试linq2db.EntityFrameworkCore

加密扩展方法:

public static class SqlFunctions
{
    [Sql.Function("DECRYPTBYPASSPHRASE", ServerSideOnly = true)]
    public static string DecryptByPassPhrase(string passphrase, byte[]? ciphertext) 
        => throw new NotImplementedException();

    [Sql.Function("ENCRYPTBYPASSPHRASE", ServerSideOnly = true)]
    public static byte[]? EncryptByPassPhrase(string passphrase, string? cleartext) 
        => throw new NotImplementedException();

}

以及基本的 CRUD 操作:

Select

var filteredSet = Set
    .Where(x => x.Id == id)
    .Where(x => x.Table2.IsSomething)
    .Select(m => new Model
    {
        Id = m.Id,
        Decrypted = SqlFunctions.DecryptByPassPhrase("test", m.Encrypted), //string
        Table2 = m.Table2,
        Encrypted = m.Encrypted //byte[]
    })
    .ToLinqToDB()
    .ToList();

插入

Set.ToLinqToDBTable()
    .Insert(() => new Model
    {
        Encrypted = SqlFunctions.EncryptByPassPhrase("test", Data)
    })

更新

Set
    .Where(x => x.Id == id)
    .Set(x => s.Encrypted, x => SqlFunctions.EncryptByPassPhrase("test", Data))
    .Update();