Не удалось выполнить запрос при использовании всегда шифрования в EF: Тип операнда clash: nvarchar(max), зашифрованный с помощью
Я создал главный ключ столбца ( CMK) и ключ шифрования Columne ( CEK) с помощью SQL Server Management Studio( SSMS), зашифровал столбец [Email] в таблице [User], он работает в БД, я вижу зашифрованное / расшифрованное значение с помощью SSMS с другая строка подключения (без / с параметром "Настройка шифрования столбца = включена").
Затем я перехожу к своему коду, который использует код EF 6.1. Сначала добавьте эту магическую строку в строку подключения, но все запросы не были выполнены.
Затем я пишу простой запрос, используя EF и LINQ, и обнаружил, что он находит при запросе по столбцам без шифрования, однако, если я запрашиваю по столбцу шифрования, он выдает следующее исключение:
'Столкновение типов операндов: nvarchar(max), зашифрованное с помощью (encryption_type = 'DETERMINISTIC', encryption_algorithm_name = 'AEAD_AES_256_CBC_HMAC_SHA_256', column_encryption_key_name = 'CEK2', column_encryption_key_xxxx_name_name_xxx_name)
Мои примеры кодов:
код запроса
var ctx = new DataAccess.VerifyContext(); var email = "email@domain.com"; var uId = Guid.Parse("..."); var uEmail = ctx.Users.Where(s => s.Email == email).FirstOrDefault(); // This will throw exception var uId = ctx.Users.Where(s => s.Id == uId).FirstOrDefault(); // This will work, and email is decrypted
Определение "пользователя" в контексте БД public class User { [Key,Required] public virtual Guid Id { get; задавать; }
[Required] public string Email { get; set; } public string ChineseName { get; set; } // other properties...
}
Таблица в БД
CREATE TABLE [dbo].[User]( [Id] [uniqueidentifier] NOT NULL, [Email] [nvarchar](max) COLLATE Latin1_General_BIN2 ENCRYPTED WITH (COLUMN_ENCRYPTION_KEY = [CEK1], ENCRYPTION_TYPE = Deterministic, ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256') NOT NULL, ... Other columns ...
Что мне не хватает?
============ Обновления =================
Похоже, что запрос структуры сущности приведёт к зашифрованному столбцу неверного типа параметра. Я пишу тот же запрос в ADO.NET, скажите ADO.NET тип параметра - DbType.String, он работает.
Таким образом, возникает вопрос, как я могу указать тип параметра для DbType.String в EntityFramework?
using (SqlConnection conn = new SqlConnection(connString))
{
conn.Open();
using (SqlCommand cmd = new SqlCommand())
{
var cmdString = @"SELECT [Id],[Email],[ChineseName] FROM [User] WHERE [EMAIL]=@Email";
cmd.CommandText = cmdString;
cmd.CommandType = System.Data.CommandType.Text;
cmd.Connection = conn;
var encryptSetting = cmd.ColumnEncryptionSetting;
var pEmail = cmd.CreateParameter();
pEmail.ParameterName = @"@Email";
pEmail.DbType = System.Data.DbType.String;
pEmail.Direction = System.Data.ParameterDirection.Input;
pEmail.Value = "a@b.c";
cmd.Parameters.Add(pEmail);
using (SqlDataReader reader = cmd.ExecuteReader())
{
if (reader.HasRows)
{
while (reader.Read())
{
Console.WriteLine(@"{0}, {1}, {2}", reader[0], reader[1], reader[2]);
}
}
}
}
Спасибо,