使用新的 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)之后一切顺利。有什么建议吗?
答案 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; }