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