ASP.NET MVC Initializer 在更新数据库期间不会为数据库播种

Posted

技术标签:

【中文标题】ASP.NET MVC Initializer 在更新数据库期间不会为数据库播种【英文标题】:ASP.NET MVC Initializer doesn't seed Database during Update-Database 【发布时间】:2019-08-30 10:31:16 【问题描述】:

标记的重复问题使用自定义上下文,我使用默认的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();
        

在我的全球 Asax 中:

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,但数据仍未播种。

【问题讨论】:

我认为在你的代码中的某个地方你必须调用 PostInitializer,这通常是在你使用的上下文中。 @BabakFakhriloo 我明白了。我将它放在 Application_Start() 方法的 Global.asax.cs 中。嗯,至少那些是我在网上看到的指南。 DropCreateDatabaseAlways Seed not called的可能重复 【参考方案1】:

好吧,我的错。解决这个问题的是运行应用程序。我认为播种会在更新数据库期间发生。这对我有用;

    运行应用程序 访问控制器与初始化程序中相关的模型,访问至少索引页面对我有用(本地主机/帖子) 在访问期间,将删除并创建数据库,然后使用初始化程序中指定的任何内容进行种子处理 关闭 Visual Studio 上连接到目标数据库的所有 SQL 选项卡,因为它可能会在删除数据库期间引发错误

【讨论】:

你也可以看看我的回答。这是在应用程序启动期间在 ASP.NET MVC 中播种数据库的最简单方法。【参考方案2】:

如下写你的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);
    

【讨论】:

谢谢,这个确实很好用。还可以在 Configuration.cs 上进行播种。只是我所学的初始化器是从这里提到的那些中派生的; entityframeworktutorial.net/code-first/… 但两者的区别在于,我的 Seed 方法会在应用程序启动后立即被调用,而其他的则不会!

以上是关于ASP.NET MVC Initializer 在更新数据库期间不会为数据库播种的主要内容,如果未能解决你的问题,请参考以下文章

七天学会ASP.NET MVC ——ASP.NET MVC 数据传递

Asp.net mvc和asp.net有啥区别?

asp.net mvc 问题!

ASP.NET MVC 和 Angularjs 与 ASP.NET MVC 和 Reactjs

七天学会ASP.NET MVC ——ASP.Net MVC 数据处理

从 ASP.NET MVC 迁移到 ASP.NET Core MVC