Инициализатор ASP.NET MVC не заполняет базу данных во время обновления базы данных - PullRequest
0 голосов
/ 09 апреля 2019

В дублированном вопросе с тегом используется пользовательский контекст, я использую значение по умолчанию ApplicationDbContext.

Я запутался, почему данные не заполняются при каждом запуске Update-Database. Я читаю другие вопросы с ответами, но, к сожалению, они используют собственный контекст, я использую значение по умолчанию ApplicationDbContext. Кажется, у них одинаковые ответы, но они не работают с моей стороны.

Я сделал следующее:

У меня есть собственный инициализатор:

public class PostInitializer : DropCreateDatabaseAlways<ApplicationDbContext>
{
        protected override void Seed(ApplicationDbContext db)
        {
            var posts = new List<Post>
            {
                new Post()
                {
                    Content = "TestA"
                },
                new Post()
                {
                    Content = "TestB"
                }
            };

            posts.ForEach(p => db.Posts.Add(p));
            db.SaveChanges();
        }
}

В Моем Глобальном Асаксе:

public class MvcApplication : System.Web.HttpApplication
{
        protected void Application_Start()
        {
            // call PostInitializer here
            Database.SetInitializer(new PostInitializer());

            AreaRegistration.RegisterAllAreas();
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
        }
}

Моя модель:

public class Post
{
     [Key]
     public int PostId { get; set; }
     public string Title { get; set; }
     public string Content { get; set; }
     public DateTime? DateTimeCreated { get; set; }
}

Я попытался удалить БД и запустить Update-Database после, однако данные по-прежнему не заполнены.

Ответы [ 2 ]

1 голос
/ 09 апреля 2019

Напишите ваш PostInitializer следующим образом:

public static class PostInitializer
{
    public static void Seed()
    {
        using (ApplicationDbContext dbContext = new ApplicationDbContext())
        {
            if (dbContext.Database.Exists())
            {
                if(!dbContext.Posts.Any())
                {
                    var posts = new List<Post>
                    {
                        new Post()
                        {
                            Content = "TestA"
                        },
                        new Post()
                        {
                             Content = "TestB"
                        }
                    };

                    posts.ForEach(p => dbContext.Posts.Add(p));
                    dbContext.SaveChanges();
                }
            }
        }
    }
}

Затем зарегистрируйте его следующим образом:

public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {

        PostInitializer.Seed(); // <-- Here it is

        AreaRegistration.RegisterAllAreas();
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
    }
}
0 голосов
/ 09 апреля 2019

Хорошо, мой плохой.Это решило запуск приложения.Я думал, что посев произойдет во время обновления базы данных.Это то, что сработало для меня;

  • Запустите приложение
  • Контроллер доступа с соответствующей моделью в Initializer, получив доступ по крайней мере к странице индекса, сработавшей для меня (localhost / posts)
  • Во время доступа база данных будет удалена и создана, а затем затравлена ​​с тем, что указано в инициализаторе
  • Закройте все вкладки SQL в Visual Studio, которые подключены к целевой БД, поскольку это может вызвать ошибку во время удаленияБаза данных
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...