我希望在实体对象内部使用ObjectContext#SaveChanges()存储验证函数。现在,我可以自己跟踪所有已更改的对象,然后循环遍历所有这些对象并调用它们的验证方法,但我想更简单的方法是实现ObjectContext在保存每个实体之前将调用的一些回调。后者可以完成吗?还有其他选择吗?
答案 0 :(得分:8)
我已经弄明白了。基本上,我们可以拦截ObjectContext的SavingChanges事件并循环通过新添加/修改的实体来调用它们的验证函数。这是我使用的代码。
partial void OnContextCreated()
{
SavingChanges += PerformValidation;
}
void PerformValidation(object sender, System.EventArgs e)
{
var objStateEntries = ObjectStateManager.GetObjectStateEntries(
EntityState.Added | EntityState.Modified);
var violatedRules = new List<RuleViolation>();
foreach (ObjectStateEntry entry in objStateEntries)
{
var entity = entry.Entity as IRuleValidator;
if (entity != null)
violatedRules.AddRange(entity.Validate());
}
if (violatedRules.Count > 0)
throw new ValidationException(violatedRules);
}
答案 1 :(得分:0)
嗯,你可以这样做,但这意味着你允许你的客户直接访问ObjectContext,而且,就个人而言,我喜欢将它抽象出来,以使客户端更易于测试。
我所做的是使用存储库模式,并在存储库上调用save时进行验证。