当前位置: 首页 > 编程语言 > C#

如何防止EF在DBContext.SaveChanges()期间验证未映射的属性分享

时间:2023-04-10 19:41:37 C#

String属性Password和ConfirmPassword。这些是未映射的,因为我将密码保存为字节数组(加盐后),因此在用户模型中有两个额外的属性(映射)InternalPassword和Salt。问题是当我使用用户模型更改密码时,实体框架抛出DBEntityValidation错误,指出“需要密码属性”。我在这里的理解是EF在保存它之前尝试验证我的模型,并且由于未设置Password/ConfirmPassword,它会抛出此错误。这引发了以下问题:1)如果属性密码明确设置为[NotMapped],为什么EF在保存期间验证它?2)如果EF在保存期间进行验证,并且在绑定期间也进行同样的操作(控制器操作方法中的IE),它会影响性能吗?(验证两次)3)解决此错误的推荐方法是什么?(如果我明确地将Password属性设置为虚拟值,错误就会消失。)编辑:我删除了代码,因为它很长并且可能是没有答案的原因。如果有人想看的话,我可以附在下面。EF中的自动验证是一种奇怪的功能——我不喜欢它。您可以阅读本文以找到有关如何验证所选属性的一些信息,但我希望您必须手动触发该验证并通过调用关闭全局验证:context.Configuration.ValidateOnSaveEnabled=false;您对NonMappedAttribute问题很感兴趣。我没有深入研究EFv4.1中的验证实现,但如果该实现是围绕与基于通用数据注释的验证相同的规则构建的,它仅使用从ValidationAttribute派生的属性-NotMappedAttribute不是从ValidationAttribute派生的。这是此类实现的另一个问题-它结合了地图定义和验证,但这两个功能是不同的,不应该由相同的API实现。@alun删除了他的答案-对您的问题的有效答案。您的验证属于视图模型,具体取决于用户正在做什么。它不是持久性模型的一部分。为什么?正是因为你当前的问题——持久化模型只能包含一个单一的验证集,应用程序中的每个操作都必须确保满足这个集合的验证条件=即使你当前的操作不需要它,你也必须确保密码已填写并确认密码=>问题。以上就是C#学习教程的全部内容:HowtopreventEFvalidationfromunmappedattributesduringDBContext.SaveChanges(),不代表立场,如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: