C# 如何处理System.Data.Entity.Validation.DbEntityValidationException?
我的应用程序出现以下错误: 类型的例外 发生“System.Data.Entity.Validation.DbEntityValidationException” 在EntityFramework.dll中,但未在用户代码中处理 其他信息:一个或多个实体的验证失败。 有关详细信息,请参阅“EntityValidationErrors”属性 我在尝试注册新用户时遇到此错误。“db.SaveChanges()上发生错误” 代码如下:C# 如何处理System.Data.Entity.Validation.DbEntityValidationException?,c#,asp.net-mvc,entity-framework,asp.net-mvc-4,C#,Asp.net Mvc,Entity Framework,Asp.net Mvc 4,我的应用程序出现以下错误: 类型的例外 发生“System.Data.Entity.Validation.DbEntityValidationException” 在EntityFramework.dll中,但未在用户代码中处理 其他信息:一个或多个实体的验证失败。 有关详细信息,请参阅“EntityValidationErrors”属性 我在尝试注册新用户时遇到此错误。“db.SaveChanges()上发生错误” 代码如下: public ActionResult Registration(
public ActionResult Registration(x.Models.User user)
{
if(ModelState.IsValid)
{
using(var db = new xDBEntities1())
{
var crypto = new SimpleCrypto.PBKDF2();
var encrpPass = crypto.Compute(user.password);
var sysUser = db.users.Create();
sysUser.email = user.email;
sysUser.username = user.username;
sysUser.password = encrpPass;
sysUser.premium_credits = 0;
sysUser.login_times = 0;
sysUser.last_ip = Request.ServerVariables["REMOTE_ADDR"];
sysUser.creation_ip = Request.ServerVariables["REMOTE_ADDR"];
sysUser.banned = 0;
sysUser.creation_date = DateTime.Now;
sysUser.creation_time = DateTime.Now.TimeOfDay;
db.users.Add(sysUser);
db.SaveChanges();
}
}
return RedirectToAction("Index", "Home");
}
编辑:
用户模型类
public class User
{
[Required]
[StringLength(50)]
[Display(Name="Username: ")]
public String username { get; set; }
[Required]
[DataType(DataType.Password)]
[StringLength(50,MinimumLength=6)]
[Display(Name="Password: ")]
public string password { get; set; }
[Required]
[EmailAddress]
[StringLength(50)]
public string email { get; set; }
public int phonenumber { get; set; }
public int mobilephonenumber { get; set; }
}
}
如何处理它?发生了某种数据库验证,阻止您将数据写入其中 本页已说明解决方案:
在使用.net mvc时,您应该使用System.Diagnostics.Debug.WriteLine()而不是Console.WriteLine(),这将在调试时写入调试输出窗口。因为在运行mvc项目时无法写入控制台。数据库和模型中的密码长度必须大于等于encrpPass的长度。即使已经有一个公认的答案,我的经验可能会对将来的人有所帮助。对于快速测试,您可以在Configuration.cs文件中检查输入到数据库的数据,然后在Model中检查验证条件。例如,在我的例子中,我将在模型中设置以下验证条件:
[Range(1, 100),DataType(DataType.Currency)]
public decimal Price { get; set; }
然后,在Configuration.cs中,将价格指定为:
new Photo{
Title = "Photo 2",
DateTaken = DateTime.Parse("2013-6-15"),
Genre = "Nature",
CameraModel = "Canon",
Price = 200
}
这将创建EntityFrameworkExceptions并阻止数据库种子设定。检查您试图将数据保存到的数据库字段的大小。将一个字段从varchar(50)更改为varchar(max)对我来说很管用
如果您使用的是实体框架,则可能必须删除并添加所做更改的表 要解决此错误,我们可以将
DatabaseContext
对象的SaveChanges()
方法包装在try
块中,并在Catch
循环中遍历每个错误,以找出错误所在。代码如下
try
{
db.SaveChanges();
}
catch (DbEntityValidationException ex)
{
foreach (var entityValidationErrors in ex.EntityValidationErrors)
{
foreach (var validationError in entityValidationErrors.ValidationErrors)
{
Response.Write("Property: " + validationError.PropertyName + " Error: " + validationError.ErrorMessage);
}
}
}
一旦发现错误,您就可以着手解决它。
希望这有帮助。您可以覆盖
保存更改
,以处理此异常并提供更好的异常详细信息
您可以在上下文类旁边创建一个类。。。该类的完整代码如下所示:
using System.Data.Entity;
using System.Data.Entity.Validation;
using System.Linq;
namespace MyNamespace
{
public partial class MyContext : DbContext
{
// Override base SaveChanges to expand out validation errors so client gets an actually helpful message
public override int SaveChanges()
{
try
{
return base.SaveChanges();
}
catch (DbEntityValidationException ex)
{
// Retrieve the error messages as a list of strings.
var errorMessages = ex.EntityValidationErrors
.SelectMany(x => x.ValidationErrors)
.Select(x => x.ErrorMessage);
// Join the list to a single string.
var fullErrorMessage = string.Join("; ", errorMessages);
// Combine the original exception message with the new one.
var exceptionMessage = string.Concat(ex.Message, " The validation errors are: ", fullErrorMessage);
// Throw a new DbEntityValidationException with the improved exception message.
throw new DbEntityValidationException(exceptionMessage, ex.EntityValidationErrors);
}
}
}
}
查看此项了解更多信息:也许这对某人有帮助:
发生此错误是因为我将EF SQL Server DB中的字段属性从var(100)更改为var(200)。我在数据库中正确地更新了,但是忘记了更新ADO属性。在.edmx文件中,您可以单击columnname并更改属性,之后它对我有效。非常感谢,这给了我验证异常的确切含义。DbEntityValidationException。。。。在.net core 2.2中找不到