Не удалось выполнить запрос при использовании всегда шифрования в 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)

Мои примеры кодов:

  1. код запроса

    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
    
  2. Определение "пользователя" в контексте БД public class User { [Key,Required] public virtual Guid Id { get; задавать; }

    [Required]
    public string Email { get; set; }
    public string ChineseName { get; set; }
    // other properties...
    

    }

  3. Таблица в БД

    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]);
                        }
                    }
                }
            }

Спасибо,

0 ответов

Другие вопросы по тегам