Я хочу вызвать функцию проверки внутри объектов сущностей прямо перед их сохранением с помощью ObjectContext # SaveChanges (). Теперь я могу сам отслеживать все измененные объекты, а затем перебирать их в цикле и вызывать их методы проверки, но я полагаю, что более простым подходом будет реализация некоторого обратного вызова, который ObjectContext будет вызывать перед сохранением каждой сущности. Можно ли вообще сделать последнее? Есть ли альтернатива?





Что ж, вы могли бы сделать это таким образом, но это означает, что вы разрешаете своим клиентам прямой доступ к ObjectContext, и лично мне нравится абстрагироваться от этого, чтобы сделать клиентов более тестируемыми.
Что я делаю, так это использую шаблон репозитория и выполняю проверку, когда в репозитории вызывается сохранение.
Я понял, как это сделать. По сути, мы можем перехватить событие SavingChanges объекта ObjectContext и пройти через вновь добавленные / измененные сущности, чтобы вызвать их функцию проверки. Вот код, который я использовал.
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);
}
Спасибо, это хорошо. Но я предпочитаю начинать с простого и добавлять дополнительные уровни абстракции только в случае необходимости. Тем не менее, клиентские тесты действительно копаются в EF и DB без какой-либо имитации - не совсем тест Ед. изм, но пока что он работает хорошо.