今天早上我有一个奇怪的问题。
我跟着这个turotial:http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/creating-an-entity-framework-data-model-for-an-asp-net-mvc-application ...
...关于如何在项目中首先实现代码。我在2周前做了同样的教程,一切都很好。从那时起,我做了一些更改并升级到MVC 4,现在Code First已停止工作。
我尝试了相同的教程,与之前在MVC3 Web应用程序中执行的完全相同的步骤,删除数据库,重新重新创建它,以及“种子”方法或DAL中的“OnModelCreating”不似乎再被召唤了。
我有我的Database.SetInitializer(新的AppInitializer());在我调用的Application_Start()中,但之后没有任何反应。
有人知道为什么这可能会突然停止工作? MVC4?
谢谢!
答案 0 :(得分:2)
当上下文发生变化时,您可以删除数据库并手动创建它,如果您使用EF Code First方法,我不相信您想要这样做,或者您可以使用您所说的调用{{1}你的应用程序开始的方法。
Database.SetInitializer()
至于protected void Application_Start() {
DbDatabase.SetInitializer(new
DropCreateDatabaseIfModelChanges<MyApp.Models.MyContext>());
// ...
}
方法,我就是这样做的
Seed()
完成后,您可以更改public class MyContextInitializer :
DropCreateDatabaseIfModelChanges <MyApp.Models.MyContext>
{
protected override void Seed(MyApp.Models.MyContext context)
{
base.Seed(context);
context.Tags.Add(new Tag
{
Name = ".NET",
Description = "Microsoft's .NET language related"
});
context.SaveChanges();
}
}
方法调用,如下所示:
DbDatabase.SetInitializer()
请注意,您可以使用您的类,只要它实现protected void Application_Start() {
DbDatabase.SetInitializer(new MyContextInitializer());
// ...
}
。
关于SQL Server的最后一件事是确保您没有与提供程序建立任何打开的连接,因为它无法删除数据库。
答案 1 :(得分:2)
可能发生的是您第一次运行该应用程序而未调用Database.SetInitializer(...)
。此时创建了数据库。但是,由于您未对模型数据库进行任何更改,因此无需创建或初始化 - 不会调用INITIALIZER上的override void Seed(...)
方法。
尝试在模型中进行一些虚拟更改,并检查它是否有效。
请注意,首次访问数据上下文时会调用override void OnModelCreating(...)
。因此,当您的主页无法访问数据库时,您应手动导航到同一页面。
答案 2 :(得分:1)
当我创建一个新的MVC4项目时,我遇到了同样的问题。结果是因为InitializeSimpleMembershipAttribute
调用Database.SetInitializer<UsersContext>(null);
。查看项目中不属于您自己的InitializeSimpleMembershipAttribute
的其他电话......
答案 3 :(得分:0)
您是否尝试将工作的MVC 3项目转换为MVC 4 / Beta,或者您是否创建了新的MVC 4 / Beta项目并按照教程进行操作?对于MVC 4 Beta Intro to ASP.NET MVC和 Intro to ASP.NET MVC 4 Beta with Visual Studio 11 Beta我从零开始。你必须做一些调试才能看出你做错了什么,MVC 4 / Beta不会破坏EF。我希望在2012年7月4日左右将Tom的优秀EF / MVC教程更新到MVC 4