gpt4 book ai didi

sql-server - 始终加密的 SQL 2016 和 Entity Framework 6 : “Operand type clash: datetime2 is incompatible with date”

转载 作者:行者123 更新时间:2023-12-05 06:40:24 25 4
gpt4 key购买 nike

当前项目:

  • MVC 5.2
  • 点网 4.6.2
  • EF 6
  • 身份 2(根据下面的存储库模式修改)
  • SQL 服务器 2016 RTM
  • 存储库模式:Persistence-Ignorant ASP.NET Identity
  • Always Encrypted 列加密,如所述herehere
  • EntityTypeConfiguration 中的所有 SQL 作为 MapToStoredProcedures();

与存储库模式教程不同,我能够将我的模型推送到数据库。我不是在使用手工组装的数据库。我确实根据第二个 Always Encrypted 链接中的两个 SQL 语句修改了迁移,对于生日和社会保险号也不足为奇。

因为我的 Entity Framework 实体指定了加密字段,

Property(x => x.Dob).HasColumnOrder(15).HasColumnName("Dob").HasColumnType("Date").IsRequired();
Property(x => x.Sin).HasColumnOrder(16).HasColumnName("Sin").HasColumnType("nvarchar").HasMaxLength(11).IsRequired();

我按以下方式在我的 User 域实体中装饰了这两个字段:

[DataType(DataType.Date)]
public DateTime Dob { get; set; }
[MaxLength(11)]
public string Sin { get; set; }

根据 this comment . 作为预防措施,我还在我的 IdentityUser.cs 文件中修饰了相同的字段。

当我尝试推送我尝试创建的默认管理用户时,使用:

public async Task<ActionResult> AddAdmin() {
var user = _userManager.FindByName("email@domain.net");
if(user == null) {
user = new IdentityUser() {
// Other fields
Dob = new DateTime(1972, 10, 12),
Sin = "726-261-050",
// Other fields
};
var createUser = await _userManager.CreateAsync(user, "password");
if (createUser.Succeeded) {
var userId = _userManager.FindByName("email@domain.net").Id;
var addRole = await _userManager.AddToRoleAsync(userId, "Admin");
if (addRole.Succeeded) {
return View("Index");
}
}
}
}

我收到以下错误:

Operand type clash: datetime2(7) encrypted with (encryption_type = 'RANDOMIZED', encryption_algorithm_name = 'AEAD_AES_256_CBC_HMAC_SHA_256', column_encryption_key_name = 'CEK1', column_encryption_key_database_name = 'database') is incompatible with date encrypted with (encryption_type = 'RANDOMIZED', encryption_algorithm_name = 'AEAD_AES_256_CBC_HMAC_SHA_256', column_encryption_key_name = 'CEK1', column_encryption_key_database_name = 'database')

发生在 _userManager.CreateAsync()

我完全不知道为什么会这样。我已在 IdentityUser() 中明确指定 Dob 作为 Date 字段,而不是 DateTime2。原始 User 模型/域及其关联的 EF 实体也是如此。实际的 DB 字段是一个 Date 字段(亲自确认了这一点),所以如果源被神秘地创建为 DateTime2,我可以理解为什么目标是一个问题,即使IdentityUser() Dob 字段也是一个 Date。理论上,IdentityUser() 中的 Date 字段不能将 DateTime2 传递给数据库。

最佳答案

我相信 EF 将所有日期类型处理为 datetime2。将 SQL Server 中的列类型更改为 datetime2 应该会有所帮助。截至目前,您唯一的选择是在 SQL Server 中将列的数据类型更改为 datetime2,因为 EF 没有任何参数生成 Hook 。

关于sql-server - 始终加密的 SQL 2016 和 Entity Framework 6 : “Operand type clash: datetime2 is incompatible with date” ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42805074/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com