c# - ModelState 是有效的,但是当我保存数据时,我在有错误的 entityValidationErrors 中得到它
问题描述
当我发布并收到模型时,此模型包含错误。我通过以下方式删除这些错误。
if (!ModelState.IsValid)
{
int pos = 0;
while (pos < ModelState.Keys.Count())
{
if (ModelState[ModelState.Keys.ElementAt(pos)].Errors.Any())
{
ModelState[ModelState.Keys.ElementAt(pos)].Errors.Clear();
}
pos++;
}
}
bool mod = ModelState.IsValid;
当我在 bool 中执行 while 的过程时,我有一个 true,即我的模型是有效的。在此过程之后,我以以下方式保留模型。
reg x = _context.register.Create();
x = _context.register.Add(data);
try
{
_context.SaveChanges();
}
catch (DbEntityValidationException e)
{
foreach (var eve in e.EntityValidationErrors)
{
Console.WriteLine("Entity of type \"{0}\" in state \"{1}\" has the following validation errors:",
eve.Entry.Entity.GetType().Name, eve.Entry.State);
foreach (var ve in eve.ValidationErrors)
{
Console.WriteLine("- Property: \"{0}\", Error: \"{1}\"",
ve.PropertyName, ve.ErrorMessage);
}
}
throw;
}
我不明白,每当我继续输入 catch 时已经清除了 ModelState 的错误,并且我看到了我之前理论上已经清除的模型的错误字段。为什么?
解决方案
因为它在验证模型时存在两个步骤。
第一步由 ASP.Net MVC Validation 完成,该验证在您在操作方法中使用它之前进行验证。实际上,在您的代码中,您只是清除了 ASP.Net MVC 检测到的错误列表,但您没有为受错误影响的模型属性设置正确的值。
在验证的第一步之后,是实体框架验证,它在通过调用将实体保存到数据库时执行SaveChanges
。EF 也使用与 ASP.Net MVC 相同的方式,通过使用数据注释,它还使用模型的配置来验证您的实体。就像我已经说过的那样,您只是清除了错误消息,但没有设置正确的值,因此使用 EF 您最终会遇到相同的错误。
在您的操作方法中清除错误消息并没有太大帮助,除非您为每个与错误相关的属性设置正确的值。
无论如何,如果您想禁用 EF 验证,您可以通过在DbContext
构造函数中设置此配置来实现:
this.Configuration.ValidateOnSaveEnabled = false;
不建议这样做,因为您可能会将不正确的数据保存到数据库中。你也可能从你的数据库中得到异常,例如当你的数据库有一个必需的列但你null
从映射到该列的属性中发送了一个值。
推荐阅读
- multithreading - [zephyr-rtos][riot-os] Zephyr vs. RIOT OS
- android - Android,constraintLayout 与 constraintDimensionRatio 适合屏幕(或其他约束布局)
- python - 遍历列表列表并删除不需要的字符串
- r - DataExplorer 无法创建 PDF 报告
- report - 有没有办法在 tablix 和页面末尾之间显示一个字符串?
- r - ggplot:更改单个图中条形的顺序
- typescript - 如何在 Typescript 中为对象属性动态分配值?
- amazon-web-services - 如何在最佳实践中查询 DynamoDB 中的大数据
- reactjs - 我将如何创建反应应用程序,但此错误不断出现
- visual-studio - 适用于 VS 2019 的 .Net 核心模板