将数据插入AlwaysEncrypted列时出错

时间:2016-04-29 10:18:10

标签: sql-server sql-server-2016

使用新的 AlwaysEncrypted 功能,我在其中一个表中加密了 DateTime 列,这是我在尝试插入新内容时遇到的错误日期:

Message: [SqlException: Operand type clash: datetime2(7) encrypted with (encryption_type = 'RANDOMIZED', encryption_algorithm_name = 'AEAD_AES_256_CBC_HMAC_SHA_256', column_encryption_key_name = 'CEK_Auto1', column_encryption_key_database_name = 'TestDb') is incompatible with datetime encrypted with (encryption_type = 'RANDOMIZED', encryption_algorithm_name = 'AEAD_AES_256_CBC_HMAC_SHA_256', column_encryption_key_name = 'CEK_Auto1', column_encryption_key_database_name = 'TestDb') Statement(s) could not be prepared.]

我也一直在为字符串添加插入错误,但在将数据类型从varchar(24)(例如)更改为 nvarchar(max)之后一切顺利。有什么建议吗?

2 个答案:

答案 0 :(得分:0)

原来这是实体框架问题。因此我最初使用模型, .NET DateTime 转换为 Sql datetime ,但EF使用 Sql datetime2 进行绑定。

有线的事情是,在将列转换为始终加密之前,我从未遇到过错误。为什么以前从未发生这对我来说仍然是个谜,但下面的sql已经解决了我的问题。我强烈建议在将Always Encrypted应用于列之前运行此操作,以避免进一步的错误:

ALTER TABLE [TestTable] ALTER COLUMN Dob datetime2

答案 1 :(得分:0)

对于 SQL 2016 加密(确定性)列, EF6 迁移 - 即使模型具有指定其的属性数据类型为datetime,仍然只将EF推送为datetime2(7)并抛出此线程上报告的冲突错误,即使手动更改迁移文件也不会解决此问题。

唯一的解决方案是在SQL数据库中使用数据类型 datetime2(7)而不是datetime

    /// <summary>
    /// *this wont work*
    /// </summary>
    [Column("addedDate", TypeName = "datetime")]
    public DateTime? AddedDate { get; set; }