在 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();
长话短说,过去几天我们一直在创建一个翻译,以通过按键将 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();