加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 如何防止EF验证在DBContext.SaveChanges()期间未映射的属

发布时间:2020-12-15 08:35:30 所属栏目:百科 来源:网络整理
导读:我有一个用户模型,其中包含两个[NotMapped]字符串属性Password和ConfirmPassword.这些是未映射的,因为我将密码保存为字节数组(在salting之后),因此在用户模型中有两个额外的属性(映射)InternalPassword和Salt. 问题是当我使用用户模型更改密码时,实体框架抛
我有一个用户模型,其中包含两个[NotMapped]字符串属性Password和ConfirmPassword.这些是未映射的,因为我将密码保存为字节数组(在salting之后),因此在用户模型中有两个额外的属性(映射)InternalPassword和Salt.

问题是当我使用用户模型更改密码时,实体框架抛出DBEntityValidation错误,指出“需要密码属性”.我在这里理解的是,EF正在尝试在保存之前验证我的模型,并且由于未设置Password / ConfirmPassword,因此抛出此错误.这提出了以下问题:

1)如果属性密码被明确表示为[NotMapped],为什么EF在保存期间验证它?
2)如果EF在保存期间执行验证,并且在绑定期间也执行相同的操作(控制器操作方法中的I.E.),它是否不会影响性能? (验证两次)
3)解决此错误的推荐方法是什么? (如果我将Password属性显式设置为虚拟值,则错误消失.)

编辑:我删除了代码,因为它很长,可能是没有答案的原因.如果有人想看看,我可以在下面添加.

解决方法

EF中的自动验证是某种奇怪的功能 – 我不喜欢它.您可以阅读 this article以查找有关如何验证所选属性的一些信息,但我希望您必须手动触发该验证并通过调用以下方式关闭全局验证:
context.Configuration.ValidateOnSaveEnabled = false;

你对NonMappedAttribute的问题很有意思.我没有深入研究EFv4.1中的验证实现,但如果实现是围绕与基于数据注释的通用验证相同的规则构建的,则它仅使用从ValidationAttribute派生的属性 – NotMappedAttribute不是从ValidationAttribute派生的.

这是此类实现的另一个问题 – 它结合了映射定义和验证,但这两个特性不同,不应由同一API实现.

@alun删除了他的答案 – 你问题的有效答案.您的验证属于视图模型,具体取决于用户正在执行的操作.它不属于持久性模型.为什么?正是由于您当前的问题 – 持久性模型只能包含单个验证集,并且应用程序中的每个操作都必须确保满足该集合的验证条件=即使您当前的操作不需要,您也必须确保填写Password和ConfirmPassword它=>问题.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读