实体框架-使用特定的验证C#上传多个实体

时间:2018-10-11 09:20:21

标签: c# entity-framework

在我的最新项目中,我正在使用entity framework将excel电子表格中的多个记录插入数据库中,我运行了一个循环以添加条目,并且将我的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 :(得分:2)

您可以使用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复制的