Entity Framework插入数据时如何排除模型中的confirmPassword属性
解决Entity Framework插入时忽略模型扩展属性的问题
看起来你是在用Entity Framework时,给User实体扩展了confirmPassword属性做密码确认验证,但插入数据库时因为这个属性没有对应列报错了对吧?这里有两个实用的解决方案:
方案1:用[NotMapped]特性标记忽略属性
这是最直接的处理方式,给confirmPassword属性加上[NotMapped]特性,告诉Entity Framework这个属性不需要映射到数据库列,保存时就会自动忽略它。
你可以直接在User部分类的属性上添加:
[MetadataType(typeof(metadataUser))] public partial class User { [NotMapped] // 标记该属性不映射到数据库 public string confirmPassword { get; set; } }
或者把特性加在Metadata类的对应属性上,效果完全相同:
public class metadataUser { [Required(ErrorMessage = "Username is required", AllowEmptyStrings = false)] [Display(Name ="Username")] public string username { get; set; } [Required(ErrorMessage ="Password is required", AllowEmptyStrings = false)] [Display(Name = "Password")] [DataType(DataType.Password)] public string password { get; set; } [NotMapped] // 这里添加也可行 [Required(ErrorMessage ="Confirmation Password is required", AllowEmptyStrings = false)] [Display(Name ="Confirmation Password")] // 顺便修正了你原来的拼写错误 [DataType(DataType.Password)] [Compare("password",ErrorMessage = "Password does not match")] public string confirmPassword { get; set; } }
方案2:使用DTO分离验证逻辑和数据库实体
如果不想修改原User实体类,也可以创建专门的DTO(数据传输对象)来接收前端输入,把验证特性放在DTO上,再将DTO的有效数据映射到User实体:
先创建DTO类:
public class UserRegisterDto { [Required(ErrorMessage = "Username is required", AllowEmptyStrings = false)] [Display(Name ="Username")] public string username { get; set; } [Required(ErrorMessage ="Password is required", AllowEmptyStrings = false)] [Display(Name = "Password")] [DataType(DataType.Password)] public string password { get; set; } [Required(ErrorMessage ="Confirmation Password is required", AllowEmptyStrings = false)] [Display(Name ="Confirmation Password")] [DataType(DataType.Password)] [Compare("password",ErrorMessage = "Password does not match")] public string confirmPassword { get; set; } }
然后在保存数据时做映射:
BootstrapTrainingEntities db = new BootstrapTrainingEntities(); var u = new User(); u.username = userDto.username; u.password = userDto.password; db.Users.Add(u); db.SaveChanges();
这种方式更符合分层架构思想,把验证和数据库持久化职责分离,后续维护扩展会更灵活。
内容的提问来源于stack exchange,提问作者Icer Exiomo
相关产品推荐
相关产品推荐

