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; }
}
我已经尝试删除数据库并在之后运行更新数据库,但是数据仍然没有种子。好,我的问题。解决这个问题的方法是运行应用程序。我以为种子会在更新数据库时发生。这就是我的工作
按如下方式编写您的
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方法将在应用程序启动时立即调用,而另一个则不会!