Перехватить сохранение сущности с помощью ADO.NET Entities Framework

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
0
2 418
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Что ж, вы могли бы сделать это таким образом, но это означает, что вы разрешаете своим клиентам прямой доступ к ObjectContext, и лично мне нравится абстрагироваться от этого, чтобы сделать клиентов более тестируемыми.

Что я делаю, так это использую шаблон репозитория и выполняю проверку, когда в репозитории вызывается сохранение.

Спасибо, это хорошо. Но я предпочитаю начинать с простого и добавлять дополнительные уровни абстракции только в случае необходимости. Тем не менее, клиентские тесты действительно копаются в EF и DB без какой-либо имитации - не совсем тест Ед. изм, но пока что он работает хорошо.

Buu Nguyen 17.01.2009 08:35
Ответ принят как подходящий

Я понял, как это сделать. По сути, мы можем перехватить событие 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);
    }

Другие вопросы по теме