[英]Always Encrypted SQL 2016 and Entity Framework 6: “Operand type clash: datetime2 is incompatible with date”
當前的項目:
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。
我們已成功實施並成功插入了記錄。
在下面的鏈接中找到參考表格。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.