使用Identity 3时手动为现有AspNetUser表添加列是否可行?
方案可行性结论
你描述的方案完全可以正常运行。DB First模式下手动同步数据库字段和实体属性是Identity 3扩展用户表的标准实现方式,只要满足对应配置要求,不会和Identity内置逻辑产生冲突。
必要配置注意事项
- 保证你手动添加的数据库列的字段名、数据类型、可空性和
ApplicationUser类中新增的属性完全匹配,例如你在数据库添加了nvarchar(50) NULL的WorkNumber列,实体类就要对应定义public string? WorkNumber { get; set; },低版本C#不支持可空引用类型的话可以调整为public string WorkNumber { get; set; }同时做好空值兼容处理 - 如果你没有禁用EF Core的默认约定配置,不需要额外加映射配置就能自动匹配字段;如果属性名和数据库列名不一致,需要用
[Column("数据库实际列名")]特性显式指定映射关系 - 不要修改
IdentityUser父类自带属性对应的数据库列结构,ApplicationUser必须保持继承自IdentityUser的实现,避免破坏Identity内置的认证、授权逻辑 - 服务注册逻辑不需要调整,保持原有
AddIdentity<ApplicationUser, IdentityRole>()的配置即可;如果是用EF Core脚手架反向生成DB First实体,生成后记得把用户实体替换为继承自IdentityUser的ApplicationUser即可
验证方法
配置完成后可以直接调用UserManager相关接口测试新增字段的读写:创建用户时给新增属性赋值,查询用户时确认能否正确读出数据库存储的对应值,只要没有抛出字段映射相关的InvalidOperationException就说明配置生效。
如果出现字段找不到的异常,优先检查是否错误给新增属性加了[NotMapped]特性,或者在DbContext的OnModelCreating方法中误配置了忽略该字段的规则。
内容的提问来源于stack exchange,提问作者Homeboy53
相关产品推荐
相关产品推荐

