C# ASP.NET MVC初始值设定项不';在更新数据库过程中更新种子数据库

C# ASP.NET MVC初始值设定项不';在更新数据库过程中更新种子数据库,c#,asp.net-mvc,entity-framework,asp.net-mvc-4,initializer,C#,Asp.net Mvc,Entity Framework,Asp.net Mvc 4,Initializer,标记的重复问题使用自定义上下文,我使用默认的ApplicationDbContext 我不明白为什么每次运行更新数据库时数据都没有被播种。我阅读了其他带答案的问题,但不幸的是,它们使用的是自定义上下文,我使用的是默认的ApplicationDbContext。他们似乎有相同的答案,但他们对我这方面不起作用 我做了以下几件事 我有一个自定义初始值设定项: public class PostInitializer : DropCreateDatabaseAlways<ApplicationDb

标记的重复问题使用自定义上下文,我使用默认的
ApplicationDbContext

我不明白为什么每次运行更新数据库时数据都没有被播种。我阅读了其他带答案的问题,但不幸的是,它们使用的是自定义上下文,我使用的是默认的
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 Post
{
     [Key]
     public int PostId { get; set; }
     public string Title { get; set; }
     public string Content { get; set; }
     public DateTime? DateTimeCreated { get; set; }
}

我已经尝试删除数据库并在之后运行更新数据库,但是数据仍然没有种子。

好,我的问题。解决这个问题的方法是运行应用程序。我以为种子会在更新数据库时发生。这就是我的工作

  • 运行应用程序
  • 使用初始化器中涉及的模型访问控制器,访问至少对我有用的索引页(localhost/posts)
  • 在访问过程中,将删除并创建数据库,然后使用初始值设定项中指定的任何内容作为种子
  • 关闭Visual Studio上连接到目标数据库的所有SQL选项卡,因为它可能在删除数据库时引发错误

  • 按如下方式编写您的
    positializer

    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);
        }
    }
    
    公共静态类后初始化器
    {
    公共静态无效种子()
    {
    使用(ApplicationDbContext dbContext=new ApplicationDbContext())
    {
    if(dbContext.Database.Exists())
    {
    如果(!dbContext.Posts.Any())
    {
    var posts=新列表
    {
    新员额()
    {
    Content=“TestA”
    },
    新员额()
    {
    Content=“TestB”
    }
    };
    posts.ForEach(p=>dbContext.posts.Add(p));
    dbContext.SaveChanges();
    }
    }
    }
    }
    }
    
    然后按如下方式注册:

    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);
        }
    }
    
    公共类MVCAPApplication:System.Web.HttpApplication
    {
    受保护的无效应用程序\u Start()
    {
    
    PostInitializer.Seed();//我认为您必须在代码的某个地方调用PostInitializer,它通常位于您使用的上下文中。@BabakFakhriloo我明白了。我将它放在应用程序_Start()的Global.asax.cs中方法。好吧,至少这些是我在网上看到的指南。可能的副本你也可以看到我的答案。这是在应用程序启动期间在ASP.NET MVC中植入数据库的最简单的方法。谢谢,这一种确实很好用。还有一种可以在Configuration.cs上完成的植入。只是我学到的初始化器是派生的与这里提到的方法不同;但两者之间的区别是,我的Seed方法将在应用程序启动时立即调用,而另一个则不会!