首页 > 解决方案 > 实体框架 - 上传具有特定验证 c# 的多个实体

问题描述

在我最新的项目中,我使用 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);
    }
  }
}

标签: c#entity-framework

解决方案


您可以使用实体验证并检查行以进行验证,同时将它们添加到模型而不是保存更改。

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


推荐阅读