Скаффолдинг MVC с шаблоном репозитория - сохранение дочерних объектов как транзакции
Я обыскивал форумы и блоги шаблонов репозиториев, чтобы найти четкое руководство о том, как я должен кодировать свой проект, и я застрял. Любая помощь или рекомендации от вас, ребята, будет очень кстати:)
Я начал свой проект как EF5 MVC4 Razor Code First и решил использовать MVCScaffolding для генерации всех моих контроллеров, представлений и репозиториев. Это был мой первый проект с этими технологиями, мне только что сказали, что именно так команда и делает сейчас (но предыдущие разработчики сначала делали модели и вручную кодировали их контексты).
Итак, все отлично, мы кодируем несколько экранов, но один из наших экранов является сложным, который включает в себя множество моделей / подмоделей (т.е. / объектная модель имеет FK для ответов, вложений, рецензентов и т. Д.), Пользователь добавляет группу данных, выбирает одного или нескольких рецензентов, добавляет 0 или более вложений. Затем они нажали Сохранить!
Теперь моя большая проблема заключается в том, что я хочу сохранить все эти данные как одну транзакцию, и если что-то не получится в одной из дочерних моделей (например, / attachments), транзакция будет откатываться. Однако, как создаются репозитории MVCScaffolding, каждая модель имеет свой собственный экземпляр контекста БД и свой собственный Save. И контроллеры принимают каждый уникальный репозиторий в качестве параметров для загрузки данных экрана. Еще одна вещь, которую стоит отметить, - для этого экрана мы используем ViewModel для загрузки данных, а затем пишем пользовательские сопоставители для сопоставления с различными моделями для сохранения. Мы можем сохранить каждый фрагмент отдельно, и, возможно, решение состоит в том, чтобы просто обернуть TransactionScope вокруг моего сохранения, но я также хочу уменьшить количество вызовов в БД, так как каждое сохранение репозитория выполняет вызов.
Я подумал, что мог бы добавить код в родительский репозиторий для сохранения типа UnitsOfWork, которое добавит / отредактирует все дочерние объекты в одном объекте контекста, но это больше похоже на хак, и я хочу написать это правильно.
Один из других проектов здесь просто создал собственный контекст БД, и все методы Save были в этом классе, это лучший способ сделать это? Другой разработчик сначала делал код, но вручную кодировал все свои методы Save. Ни один из них не находится в стандартном месте, и он использует TransactionScope с DB Context внутри (это избыточно или DB Context не обрабатывает транзакции)?
Поскольку я новичок в этом, мне нужна помощь, и никто, с кем я работаю, похоже, не согласен с правильным методом. Я не уверен, что моя модель не подходит для "MVC App", так как я очень много думаю о базе данных.
Ниже приведен образец моих моделей, любые рекомендации приветствуются. Спасибо:)
public class Anomaly
{
[Key]
public int AnomalyId { get; set; }
public string Subject { get; set; }
public int PlantId { get; set; }
[ForeignKey("PlantId")]
public virtual Plant Plant { get; set; }
public DateTime? ReviewByDate { get; set; }
public virtual ICollection<AnomalyReviewer> AnomolyReviewers { get; set; }
public virtual ICollection<AnomalyAttachment> AnomalyAttachments { get; set; }
}
public class AnomalyAttachment
{
[Key]
public int AnomalyAttachmentId { get; set; }
public int AnomalyId { get; set; }
[ForeignKey("AnomalyId")]
public virtual Anomaly Anomaly { get; set; }
public string FilePath { get; set; }
public string FileName { get; set; }
public string FileExtension { get; set; }
public string Notes { get; set; }
}
пс. это всего лишь образец... спасибо!
1 ответ
Просто создайте класс 'Master', который наследуется от Controller. Затем напишите все свои запросы там, как в общедоступном User GetUserById(Int32 id). Наконец, создайте функцию, которая выполняет вызов private!! реализация DbContext.
Обычно я предоставляю этой функции перечисление SystemEvents, поэтому у меня есть справка о том, что происходит, если что-то не получится... конечно, вам нужно написать свой собственный уведомитель или модель для записи собственных ошибок в базу данных для личного тестирования...
Я сделал все это, потому что я могу написать весь свой код и обнаружил, что шаблон репозитория в большинстве случаев является излишним, если вы действительно думаете об этом.