2

当前的项目:

  • MVC 5.2
  • 点网 4.6.2
  • 英孚 6
  • 身份 2(根据下面的存储库模式修改)
  • SQL Server 2016 RTM
  • 存储库模式:持久性忽略 ASP.NET 身份
  • 此处此处描述的始终加密列加密
  • 所有 SQLMapToStoredProcedures();如下EntityTypeConfiguration

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

因为我的实体框架实体指定了加密字段,

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

根据此评论作为预防措施,我还在我的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");
      }
    }
  }
}

我收到以下错误:

操作数类型冲突:使用 (encryption_type = 'RANDOMIZED', encryption_algorithm_name = 'AEAD_AES_256_CBC_HMAC_SHA_256', column_encryption_key_name = 'CEK1', column_encryption_key_database_name = 'database') 加密的 datetime2(7) 与使用 (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().

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

4

2 回答 2

1

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

于 2017-03-15T19:10:15.230 回答
0

如果我们不想将 from 的数据类型更改datetimedatetime2. 因为 datetime 扩展最后一个小数点后的 7 位。

通过下面的脚本检查。b/w datetime 和 datetime2 的区别。

select * from newdatetimetest ALTER TABLE newdatetimetest ALTER column mydatetime datetime2

select * from newdatetimetest ALTER TABLE newdatetimetest ALTER column mydatetime datetime

select * from newdatetimetest

您可以实现自定义拦截器以将实体框架 datetime2 数据类型转换为日期时间。

我们已经成功实现并成功插入记录。

在下面的链接中找到参考表格。

https://github.com/aspnet/EntityFramework6/issues/578

https://github.com/aspnet/EntityFramework6/pull/1147

于 2019-10-16T10:28:21.763 回答