【发布时间】:2017-03-15 08:57:59
【问题描述】:
当前项目:
- MVC 5.2
- 点网 4.6.2
- EF 6
- 身份 2(根据以下存储库模式修改)
- SQL Server 2016 RTM
- 存储库模式:Persistence-Ignorant ASP.NET Identity
- 始终加密列加密,如 here 和 here 所述
-
EntityTypeConfiguration中的所有 SQL 为MapToStoredProcedures();
与存储库模式教程不同,我能够将模型推送到数据库。我不是在使用手工组装的数据库。我确实根据第二个 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; }
根据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");
}
}
}
}
我收到以下错误:
操作数类型冲突:datetime2(7) 用 (encryption_type = “随机”,加密算法名称 = 'AEAD_AES_256_CBC_HMAC_SHA_256',column_encryption_key_name = 'CEK1', column_encryption_key_database_name = 'database') 不兼容 用 (encryption_type = 'RANDOMIZED', 加密算法名称 = '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 字段(已亲自确认),所以我可以看到为什么如果源被神秘地创建为 DateTime2 时目标是一个问题,即使 IdentityUser() Dob 字段是Date 也是。理论上,IdentityUser() 中的Date 字段不能将DateTime2 传递给数据库。
【问题讨论】:
标签: sql-server asp.net-mvc sql-server-2016 asp.net-mvc-5.2 always-encrypted