Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何处理System.Data.Entity.Validation.DbEntityValidationException?_C#_Asp.net Mvc_Entity Framework_Asp.net Mvc 4 - Fatal编程技术网

C# 如何处理System.Data.Entity.Validation.DbEntityValidationException?

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(

我的应用程序出现以下错误:

类型的例外 发生“System.Data.Entity.Validation.DbEntityValidationException” 在EntityFramework.dll中,但未在用户代码中处理

其他信息:一个或多个实体的验证失败。 有关详细信息,请参阅“EntityValidationErrors”属性

我在尝试注册新用户时遇到此错误。“db.SaveChanges()上发生错误”

代码如下:

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中找不到