簡體   English   中英

始終加密的SQL 2016和Entity Framework 6:“操作符類型沖突:datetime2與日期不兼容”

[英]Always Encrypted SQL 2016 and Entity Framework 6: “Operand type clash: datetime2 is incompatible with date”

當前的項目:

  • MVC 5.2
  • 點網4.6.2
  • EF 6
  • 身份2(根據下面的存儲庫模式修改)
  • SQL Server 2016 RTM
  • 存儲庫模式: 無需持久性的ASP.NET身份
  • 如此此處所述,始終加密列加密
  • 所有SQL都為MapToStoredProcedures(); EntityTypeConfiguration

與存儲庫模式教程不同,我能夠將模型推送到數據庫。 我不是在手工組裝數據庫上工作。 我確實按照第二個“始終加密”鏈接中的兩個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)與( 'AEAD_AES_256_CBC_HMAC_SHA_256',column_encryption_key_name ='CEK1',column_encryption_key_database_name ='數據庫')

發生在_userManager.CreateAsync()

我完全不知道為什么會這樣。 我已經在IdentityUser()中將Dob明確指定為Date字段,而不是DateTime2 原始User模型/域及其關聯的EF實體也是如此。 實際的DB字段是一個Date字段(對此進行了個人確認),因此,即使IdentityUser() Dob字段也是一個Date ,我也可以看到如果將源神秘地創建為DateTime2 ,那么為什么目的地是一個問題。 從理論上講, IdentityUser()Date字段不能將DateTime2傳遞給DB。

我相信EF將所有日期類型都作為datetime2處理。 將SQL Server中的列類型更改為datetime2應該會有所幫助。 到目前為止,您唯一的選擇是在SQL Server中將列的數據類型更改為datetime2,因為EF在參數生成方面沒有任何鈎子。

如果我們不想將數據類型從datetime更改為datetime2 因為datetime擴展了最后一個小數點后的7位數字。

通過以下腳本檢查。 黑白日期時間和日期時間的差異2。

select * from newdatetimetest ALTER TABLE newdatetimetest ALTER column mydatetime datetime2

select * from newdatetimetest ALTER TABLE newdatetimetest ALTER column mydatetime datetime

select * from newdatetimetest

您可以實現自定義攔截器,以將entityframework datetime2數據類型轉換為datetime。

我們已成功實施並成功插入了記錄。

在下面的鏈接中找到參考表格。

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM