Entity Framework - загрузка нескольких объектов с определенной проверкой c # - PullRequest
0 голосов
/ 11 октября 2018

В моем последнем проекте я вставляю несколько записей из электронной таблицы Excel в базу данных, используя entity framework, я запускаю цикл для добавления записей и помещаю свой saveChanges() после цикла, так как я не хочу его запускатьдля каждого ряда по соображениям производительности.

Я создал проверку, намеренно оставив обязательное поле пустым в одной из строк во время моего тестирования.Я хотел бы быть более конкретным в своей ошибке о том, из какой строки произошла эта ошибка (этот код упрощен для краткости, моя единственная задача - найти номер строки EntityValidationErrors):

foreach (DataRow row in dt.Rows)
{
  lineNumber++;
  try
  {
     row["PK"] = Guid.NewGuid();
     row["EditDateTime"] = DateTime.Now;
     db.dbentry.Add(dbEntry);
  }
  catch (Exception ex)
  {
    if (lineNumber <= dt.Rows.Count)
    {
      error += "error from line" + lineNumber + " : " + ex.Message + "<br/>";
    }
  }
}
try
{
  db.SaveChanges();
}
catch (DbEntityValidationException ex)
{
  foreach (var e in ex.EntityValidationErrors)
  {
    foreach (var ve in e.ValidationErrors)
    {
      error = error + string.Format("- Property: \"{0}\", Error: \"{1}\"", ve.PropertyName, ve.ErrorMessage);
    }
  }
}

1 Ответ

0 голосов
/ 11 октября 2018

Вы можете использовать Entity Validatiion и проверять строки на предмет проверки при добавлении их в модель, а не сохранять изменения.

protected override System.Data.Entity.Validation.DbEntityValidationResult ValidateEntity(DbEntityEntry entityEntry, System.Collections.Generic.IDictionary<object, object> items)
{
    if (entityEntry.Entity is Student)
    {
        if (entityEntry.CurrentValues.GetValue<string>("StudentName") == "")
        {
            var list = new List<System.Data.Entity.Validation.DbValidationError>();
            list.Add(new System.Data.Entity.Validation.DbValidationError("StudentName", "StudentName is required"));

            return new System.Data.Entity.Validation.DbEntityValidationResult(entityEntry, list);
        }
    }
    return base.ValidateEntity(entityEntry, items);
}

Код от http://www.entityframeworktutorial.net/EntityFramework4.3/validate-entity-in-entity-framework.aspx

ОБНОВЛЕНИЕ: Существует также более простой способ заставить его работать с помощью DataAnnotations.

Вы можете пометить свойство вашей модели таким атрибутом, как

[Required]
public string UserName { get; set; }

И затем вы можете использовать эти строки для проверки модели.

var user = new User();
var context = new ValidationContext(user, serviceProvider: null, items: null);
var results = new List<ValidationResult>();

var isValid = Validator.TryValidateObject(user, context, results);

if (!isValid)
{
    foreach (var validationResult in results)
    {
        Console.WriteLine(validationResult.ErrorMessage);
    }
}

Этот сегмент кодаскопировано с https://odetocode.com/blogs/scott/archive/2011/06/29/manual-validation-with-data-annotations.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...