我正在关注EF6和Codefirst的本教程。 http://www.asp.net/mvc/overview/getting-started/getting-started-with-ef-using-mvc/creating-an-entity-framework-data-model-for-an-asp-net-mvc-application
我启动了一个解决方案并添加了模型,上下文和初始化程序
namespace TestContoso.DAL
{
public class SchoolContext : DbContext
{
public SchoolContext()
: base("Name=SchoolContextDB")
{
}
public DbSet<Student> Students { get; set; }
public DbSet<Enrollment> Enrollments { get; set; }
public DbSet<Course> Courses { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
}
}
}
并创建了一个虚拟的Home Controller和Index视图。
namespace TestContoso.Controllers
{
public class HomeController : Controller
{
private SchoolContext db = new SchoolContext();
//
// GET: /Home/
public ActionResult Index()
{
return View();
}
}
}
我还设置了连接字符串并在web.config中设置了初始化程序
<entityFramework>
<contexts>
<context type="TestContoso.DAL.SchoolContext, TestContoso">
<databaseInitializer type="TestContoso.DAL.SchoolInit, TestContoso"/>
</context>
</contexts>
当我运行解决方案时,我的期望是数据库将被创建,但是我注意到OnModelCreating事件永远不会触发,因此永远不会创建数据库。为什么不创建数据库?我将如何导致Code First迁移?
答案 0 :(得分:0)
这篇文章为您提供了另一种选择。尝试通过代码添加初始化策略的替代方法,看看是否有效。
作为在Web.config文件中设置初始化程序的替代方法是在代码中通过向Global.asax.cs文件中的Application_Start方法添加Database.SetInitializer语句来执行此操作。
Database.SetInitializer(new CreateDatabaseIfNotExists<SchoolContext>());
并在评论中指定。对数据运行查询或按照“设置EF以使用测试数据初始化数据库”部分自动为数据库设定种子。
答案 1 :(得分:0)
当有一些查询查询该模型时,OnModelCreating事件似乎只被触发,以测试我刚刚在Index控制器中添加了一个虚拟查询并且它有效。
public class HomeController : Controller
{
private SchoolContext db = new SchoolContext();
//
// GET: /Home/
public ActionResult Index()
{
var students = from s in db.Students
select s;
return View();
}
}
}