c# - 实体框架 - 上传具有特定验证 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);
}
}
}
解决方案
您可以使用实体验证并检查行以进行验证,同时将它们添加到模型而不是保存更改。
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
推荐阅读
- delphi - SFTP 客户端是否需要在最终用户计算机上设置协议才能运行?
- python - 无法在 Windows 10 上使用 python 3 安装 mod_wsgi
- reactjs - 警告:在 StrictMode 中不推荐使用 findDOMNode,react-redux-notify
- vue.js - 模块构建失败(来自./node_modules/eslint-loader/index.js):错误:找不到模块'eslint/lib/formatters/stylish'
- python - 更改数据熊猫数据框
- c - 我这里有一个5条目的链表,向堆中添加信息的过程没有完成,我不知道错误在哪里
- javascript - 试图读取输入字段的值
- java - 我该如何解决这个方法?
- javascript - 如何使用 history.goBack 关闭弹出窗口以及如何在通过直接链接打开后关闭弹出窗口
- linux - 将 FreeIPA 服务器作为 docker 容器启动时出错