【发布时间】:2014-07-22 23:51:08
【问题描述】:
我有一个进程正在导入 Excel 电子表格,并将数据解析到我的数据对象中。这些数据的来源非常值得怀疑,因为我们正在将我们的客户从基于电子表格的数据管理转移到一个可检查有效数据的托管数据库系统。
在我的导入过程中,我对数据进行了一些基本的完整性检查,以适应我们正在导入的数据可能有多糟糕,但我在 DbContext 中完成了我的整体验证。
我正在尝试做的部分事情是,我想在电子表格中提供数据错误的第 # 行,以便他们可以轻松确定需要修复什么来导入文件。
一旦我从电子表格 (model) 中获得数据,以及他们正在使用的数据库 (opp) 中的机会,这是我的流程的伪代码:
foreach (var model in Spreadsheet.Rows) { // Again, pseudocode
if(opp != null && ValidateModel(model, opp, row)) {
// Copy properties to the database object
// This is in a Repository-layer method, not directly in my import process.
// Just written here for clarity instead of several nested method calls.
context.SaveChanges();
}
}
如果需要,我可以在此处提供更多代码,但问题在于我的 DbContext 的 ValidateEntity() 方法(覆盖 DbContext)。
同样,据我所知,我编写的代码没有任何问题,但如果机会未能通过此级别的验证,那么它将作为未保存对象的一部分保留在 context 中,这意味着每次调用 ValidateEntity() 时它都会反复尝试进行验证。这会导致在初始问题发生后,每一行都会重复相同的验证错误消息。
有没有办法[编辑]让上下文在验证失败一次后停止尝试验证对象[编辑]?我知道我可以等到最后再打电话给context.SaveChanges() 一次来解决这个问题,但我希望能够将它与数据库中的行匹配。
作为参考,我正在使用 Entity Framework 6.1 和 Code First 方法。
编辑试图进一步澄清 Marc L.(包括对上述代码块的更新)
现在,我的流程将遍历电子表格中的行数。我之所以调用我的存储库层并保存每个对象,而不是使用只调用一次context.SaveChanges() 的方法,是为了让自己能够确定哪一行是导致验证错误的行。
我很高兴我的 DbContext 的自定义 ValidateEntity() 方法捕获了验证错误,但问题在于它没有为同一实体多次抛出 DbEntityValidationException。
我希望如果对象验证失败一次,上下文不再尝试保存对象,无论context.SaveChanges() 被调用多少次。
【问题讨论】:
-
"有没有办法从
context'分离'有问题的对象而不从数据库中删除?..." 也许我误解了,但如果对象足够有效以获得进入数据库,然后从DbContext的角度来看它是有效的。如果它在更高的业务对象角度无效,那是应该在其他地方处理的不同级别的验证,并且您的自定义DbContext缺乏适当的关注点分离......请澄清。 -
@Jimmy 我不认为这真的是我想要做的。也许“分离”是我试图使用的错误术语。
-
@MarcL。我会尽量澄清更多。
标签: c# entity-framework validation dbcontext validationerror