Как обрабатывать 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**