Скаффолдинг 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, поэтому у меня есть справка о том, что происходит, если что-то не получится... конечно, вам нужно написать свой собственный уведомитель или модель для записи собственных ошибок в базу данных для личного тестирования...

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