gpt4 book ai didi

c# - ModelState 是有效的,但是当我保存数据时,我在有错误的 entityValidationErrors 中得到它

转载 作者:行者123 更新时间:2023-11-30 23:03:01 24 4
gpt4 key购买 nike

当我发布并收到模型时,该模型包含错误。我通过以下方式删除这些错误。

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 检测到的错误列表,但您没有为受错误影响的模型属性设置正确的值。

在第一步验证之后, Entity Framework 验证将在通过调用 SaveChanges 将实体保存到数据库时执行。 EF 还通过使用数据注释使用与 ASP.Net MVC 相同的方式,它还使用模型的配置来验证您的实体。就像我已经说过的,您只是清除了错误消息,但没有设置正确的值,因此对于 EF,您最终会遇到相同的错误。

清除操作方法中的错误消息并没有太大帮助,除非您为错误所涉及的每个属性设置正确的值。

无论如何,如果您想禁用 EF 验证,您可以通过在 DbContext 构造函数中设置此配置来实现:

this.Configuration.ValidateOnSaveEnabled = false;

不推荐这样做,因为您可能会在数据库中保存不正确的数据。你也可能从你的数据库中得到异常,例如当您的数据库有一个必需的列,但您从映射到该列的属性发送了一个 null 值。

关于c# - ModelState 是有效的,但是当我保存数据时,我在有错误的 entityValidationErrors 中得到它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50170994/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com