0

I have a strange problem this morning.

I followed this 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 ...

... on how to implement code first in your projects. I did the same tutorial 2 weeks ago and everything worked great. Since then, I made some changes and upgraded to MVC 4, and now Code First has stop working.

I tried the same tutorials, with exact same step I did before in a MVC3 web app, Drop the database, re-re-recreated it, and the "Seed" method Or the "OnModelCreating" in the DAL don't seems to be called any more.

I have my Database.SetInitializer(new AppInitializer()); In my Application_Start(), which is called, but after that nothing happens.

Somebody knows why this could have stop working suddenly? MVC4?

Thank you!

4

4 回答 4

2

可能发生的情况是您第一次运行应用程序而没有调用Database.SetInitializer(...). 此时数据库已创建。但是由于您没有对模型数据库进行任何更改,因此不需要创建或初始化 -override void Seed(...)不会调用 INITIALIZER 上的方法。

尝试在您的模型中进行一些虚拟更改并检查它是否有效。

请注意,override void OnModelCreating(...)第一次访问数据上下文时会调用它。因此,当您的主页不访问数据库时,您应该手动导航到可以访问的同一页面。

于 2014-03-25T11:44:49.837 回答
2

当上下文发生变化时,您可以删除数据库并手动创建它,如果您使用的是 EF Code First 方法,我认为您不想这样做,或者您可以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());
    // ...
}

请注意,您可以使用您的类,只要它实现了IDatabaseInitializer.

关于 SQL Server 的最后一件事是确保您没有与提供程序的任何打开的连接,因为它无法删除数据库。

于 2012-04-09T20:43:25.293 回答
1

当我创建一个新的 MVC4 项目时,我遇到了同样的问题。原来是因为InitializeSimpleMembershipAttribute来电 Database.SetInitializer<UsersContext>(null);。看看InitializeSimpleMembershipAttribute你的项目中不属于你自己的其他调用......

于 2012-11-14T00:41:53.187 回答
0

您是否尝试将您的工作 MVC 3 项目转换为 MVC 4/Beta 或者您是否创建了一个新的 MVC 4/Beta 项目并按照教程进行操作?对于MVC 4 Beta Intro to ASP.NET MVCIntro to ASP.NET MVC 4 Beta with Visual Studio 11 Beta我从头开始。您必须进行一些调试以查看您做错了什么,MVC 4/Beta 不会破坏 EF。我希望在 2012 年 7 月 4 日左右将 Tom 的优秀 EF/MVC 教程更新到 MVC 4

于 2012-04-10T00:39:37.950 回答