ASP.NET MVC 3 Scaffolding: работа с IDatabaseInitializer(TContext)

воскресенье, 22 мая 2011, Александр Краковецкий

В предыдущей статье ASP.NET MVC 3 Scaffolding с помощью библиотеки MvcScaffolding мы рассмотрели библиотеку MvcScaffolding и ее базовые возможности. Сегодня посмотрим детальнее на интерфейс IDatabaseInitializer(TContext) и на то, как он может помочь нам при скаффолдинге.

Итак, пусть у нас есть классы Team и Player:

namespace SoccerSite.Models
{
    public class Team
    {
        public int TeamId { get; set; }
        [Required] public string Name { get; set; }
        public string City { get; set; }
        public DateTime Founded { get; set; }
        public override ICollection<Player> { get; set; }
    }

    public class Player
    {
        public int PlayerId { get; set; }
        public string Name { get; set; }

        // Having a property called <Entity>Id defines a relationship
        public int TeamId { get; set; }

        public Team Team { get; set; }
    }
}

(!) связи между сущностями рассмотрим в одной из следующих статей.

После того, как мы заскаффолдим Team и Player (при этом будут созданы все необходимые классы & вьюхи) мы запускаем проект и можем убедиться в том, что соответствующие таблицы с полями были созданы в соответствии с нашей моделью.

Команды для скаффолдинга нашей модели:

Scaffold Controller Team -Repository -Force

Scaffold Controller Player -Repository -Force

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

Чтобы избежать этой проблемы в файл Global.asax в методе Application_Start() необходимо дописать следующую строку:

Database.SetInitializer(new DropCreateDatabaseIfModelChanges<YourContext>());

В таком случае база данных будет удалена и создана заново.

Кроме DropCreateDatabaseIfModelChanges есть еще следующие реализации:

Как вы понимаете, при пересоздании базы данных все созданные вами тестовые данные будут удалены, что не совсем хорошо. Для того, чтобы этого избежать, необходимо создать наследника одного из рассмотренных выше классов и переопределить метод Seed():

  public class ContextInitializer : DropCreateDatabaseIfModelChanges<MvcApplication2.Models.MvcApplication2Context>
        {
            protected override void Seed(Models.MvcApplication2Context context)
            {
                new List<Team>() { 
                    new Team {
                        Name = "Dynamo",
                        Founded = DateTime.Now,
                        City = "Kyiv",
                        Players = new List<Player>(){
                            new Player {
                                Name = "player1",
                                Smething = "sdsd"
                            }
                        }
                   }
                }.ForEach(c => context.Teams.Add(c));

                base.Seed(context);
            }
        }

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

В следующих статьях поговорим о дефолтных скаффолдерах и основных параметрах, а также рассмотрим вопросы генерации зависимостей и кастомизации шаблонов T4 для управления кодогенерацией.

Компании из статьи


Microsoft Украина


Сайт:
http://www.microsoft.com/ukr/ua/

Microsoft Украина Украинское подразделение компании Microsoft.

Ищите нас в интернетах!

Комментарии

Свежие вакансии