Csharp/C#教程:如何防止EFvalidation在DBContext.SaveChanges()期间未映射的属性分享


如何防止EFvalidation在DBContext.SaveChanges()期间未映射的属性

我有一个用户模型,其中包含两个[NotMapped]字符串属性Password和ConfirmPassword。 这些是未映射的,因为我将密码保存为字节数组(在salting之后),因此在用户模型中有两个额外的属性(映射)InternalPassword和Salt。

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

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

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

EF中的自动validation是某种奇怪的function – 我不喜欢它。 您可以阅读本文以查找如何validation所选属性的一些信息,但我希望您必须手动触发该validation并通过调用以下方式关闭全局validation:

 context.Configuration.ValidateOnSaveEnabled = false; 

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

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

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

上述就是C#学习教程:如何防止EFvalidation在DBContext.SaveChanges()期间未映射的属性分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/1042951.html

(0)
上一篇 2022年1月31日
下一篇 2022年1月31日

精彩推荐