Как обрабатывать System.Data.Entity.Validation.DbEntityValidationException?

Мое приложение получает следующую ошибку:

Исключение типа Вышло сообщение "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; }

    }
}

Как я могу справиться с этим?

Ответ 1

Существует некоторая проверка валидации базы данных, которая препятствует записи данных в нее.

Решение уже указано на этой странице:

Не удалось выполнить проверку для одного или нескольких объектов. Дополнительную информацию см. В разделе Свойство EntityValidationErrors

В качестве дополнительного примечания к этому при использовании .net mvc вы должны использовать System.Diagnostics.Debug.WriteLine() вместо Console.Writeline(), и это будет записываться в окно вывода отладки при отладке. Поскольку вы не можете писать на консоль при запуске проекта mvc.

Ответ 2

Чтобы решить эту ошибку, мы можем обернуть метод SaveChanges() объекта DatabaseContext в блоке 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);
                }
            }
        }

Как только ошибка обнаружена, вы можете ее исправить, чтобы исправить ее. Надеюсь, поможет. Спасибо

Ответ 3

Вы можете переопределить SaveChanges, чтобы обработать это исключение и предоставить более подробные сведения об исключении.

Вы можете создать класс "рядом" с вашим классом контекста... полный код для этого класса выглядит следующим образом:

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);
                }
            }
        }
    }

Проверьте это для получения дополнительной информации: http://devillers.nl/blog/improving-dbentityvalidationexception/

Ответ 4

Несмотря на уже принятый ответ, мой опыт, вероятно, может помочь кому-то в будущем. Для быстрого теста вы можете проверить данные, которые вы вводите в базу данных в файле Configuration.cs, а затем в модели вы можете проверить условия проверки. Например, в моем случае я бы поставил следующее условие проверки в модели:

[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 и предотвратило загрузку базы данных.

Ответ 5

Длина пароля в БД и модели должна быть > =, что длина encrpPass.

Ответ 6

Проверьте размер полей базы данных, к которым вы пытаетесь сохранить данные. Изменение поля из varchar (50) в varchar (max) сделало трюк для меня.

Если вы используете Entity Framework, вам может потребоваться удалить и добавить таблицу, в которую были внесены изменения.

Ответ 7

**check that Number of insert field are same as per database or match the database filed column**