Выполнение логики перед сохранением или проверкой с использованием EF Code-First Models - PullRequest
3 голосов
/ 23 марта 2012

Я все еще привыкаю к ​​EF Code First, проведя годы, работая с Ruby ORM, ActiveRecord.ActiveRecord имел все виды обратных вызовов , таких как before_validation и before_save, где можно было изменить объект до того, как он будет отправлен на уровень данных.Мне интересно, существует ли эквивалентная техника в моделировании объектов EF Code First.

Конечно, я знаю, как устанавливать элементы объекта во время создания экземпляра (для установки значений по умолчанию и т. Д.), Но иногда вынужно вмешиваться в разные моменты жизненного цикла объекта.

Чтобы использовать слегка надуманный пример, скажем, у меня есть объединяющая таблица, связывающая авторов и пьесы, представленная соответствующим объектом Authoring:

public class Authoring
{
  public int ID { get; set; }

  [Required]
  public int Position { get; set; }

  [Required]
  public virtual Play Play { get; set; }

  [Required]
  public virtual Author Author { get; set; }
}

где Position представляет упорядоченный по нулям порядок авторов, связанных с данной игрой.(У вас может быть одна пьеса «Южная часть Тихого океана» с двумя авторами: автором «Роджерса» с позицией 0 и автором «Гаммерштейна» с позицией 1.)

Допустим, я хотел создать методчто перед сохранением записи авторинга он проверил, существуют ли авторы той пьесы, с которой она была связана.Если нет, он устанавливает Позицию в 0. Если да, он находит Позицию с наивысшим значением, связанным с этим воспроизведением, и увеличивает его на единицу.

Где бы я реализовал такую ​​логику в первой модели кода EFслой?И, в других случаях, что если я захочу обработать данные в коде, прежде чем они будут проверены на наличие ошибок валидации?

По сути, я ищу эквивалент вышеупомянутых хуков жизненного цикла Rails или какой-то способ, по крайней мере, подделать его.:)

Ответы [ 2 ]

3 голосов
/ 24 марта 2012

Вы можете переопределить DbContext.SaveChanges, сделать там исправление и вызвать base.SaveChanges (). Если вы сделаете это, вы можете вызвать DetectChanges, прежде чем приступать к исправлению. Btw. та же проблема обсуждается в книге DbContext Framework of Entity Framework (ISBN 978-1-449-31296-1) на страницах 192-194. И да, это в контексте проверки ...

3 голосов
/ 23 марта 2012

Вы можете реализовать IValidatableObject.Это дает вам один хук:

IEnumerable<ValidationResult> Validate(ValidationContext validationContext)

И вы можете применить свою логику проверки там.

Также есть событие SavingChanges на ObjectContext (которое вы можете получить из DbContext).

Вы можете просто создать пользовательский интерфейс IDoStuffOnSave и применить его к своим сущностям, которым необходимо выполнить некоторую логику при сохранении (ничего из коробки нет)

...