使用ASP.NET MVC 3项目正在使用Entity Framework 4.1的Code First功能。
但是,数据库(SQL Server 2008 R2)不会在应用程序启动时自动创建表映射。关于如何做到这一点的任何想法?
该项目只有一个POCO:
namespace RIS.Models
{
public class Person
{
[Key]
public virtual string NRIC { get; protected set; }
public virtual string FirstName { get; protected set; }
public virtual string MiddleName { get; protected set; }
public virtual string LastName { get; protected set; }
}
}
它还具有以下数据库上下文类:
namespace RIS.Models
{
public class RIS_DB : DbContext
{
public DbSet<Person> People { get; set; }
}
}
我已将SQL连接字符串添加到全局web.config文件中,如下所示:
<add name="RIS_DB" connectionString="Data Source=URAHARA-PC;Initial Catalog=RIS_DB;
Integrated Security=SSPI;Pooling=False" providerName="System.Data.SqlClient"/>
如果Global.asax.cs文件中不存在数据库,还有一个明确的指令来创建数据库:
protected void Application_Start()
{
Database.SetInitializer(new CreateDatabaseIfNotExists<RIS_DB>());
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
}
答案 0 :(得分:67)
在MSDN论坛上询问,并得到了满意的答案:
实体框架在首次访问之前不会创建数据库。 Application_Start()
中的当前代码块仅指定在首次访问期间创建数据库时使用的策略。
要在启动时触发创建数据库,必须创建数据库上下文的实例,并且必须调用context.Database.Initialize(true)
。
答案 1 :(得分:3)
我遇到了同样的问题并找到了一个优雅的解决方案:在DbContext的构造函数中调用SetInitializer:
public class MyDbContext : DbContext
{
protected MyDbContext : this("MyConnection")
{
Database.SetInitializer<MyDbContext>(new CreateDatabaseIfNotExists<MyDbContext>());
}
}
我的应用设置:
<connectionStrings>
<add
name="MyConnection"
connectionString="Data Source=(LocalDb)\v11.0;AttachDbFilename=|DataDirectory|\MyDB.mdf;Initial Catalog=MyDB;Integrated Security=True"
providerName="System.Data.SqlClient" />
</connectionStrings>
答案 2 :(得分:1)
我知道mazatsushi已经以最正确的方式回答了这个问题。 但只是为了澄清这个问题: 根据mazatsushi的回答你要做的就是写:
Database.SetInitializer(new DropCreateDatabaseIfModelChanges<SorteoContext>());
using (var context = new SorteoContext())
{
context.Database.Initialize(force: true);
}
在Global.asax.cs中的Application_Start()函数内部 和轰!作品!