Visual studio 2010 实体框架未创建数据库

Visual studio 2010 实体框架未创建数据库,visual-studio-2010,entity-framework,asp.net-mvc-3,ef-code-first,sql-server-2008-r2,Visual Studio 2010,Entity Framework,Asp.net Mvc 3,Ef Code First,Sql Server 2008 R2,我们一直在使用ASP.NETMVC3项目研究EntityFramework4.1的代码优先特性 但是,数据库(SQL Server 2008 R2)不会在应用程序启动时自动创建表映射。有没有办法让它这样做 该项目只有一个POCO: namespace RIS.Models { public class Person { [Key] public virtual string NRIC { get; protected set; }

我们一直在使用ASP.NETMVC3项目研究EntityFramework4.1的代码优先特性

但是,数据库(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; }
    }
}
名称空间RIS.Models
{
公共类RIS_DB:DbContext
{
公共数据库集人物{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);
}
受保护的无效应用程序\u Start()
{
SetInitializer(新的CreateDatabaseIfNotExists());
RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
注册地址(RouteTable.Routes);
}

转而在MSDN论坛上四处询问,得到了满意的答案:

实体框架在首次访问之前不会创建数据库。
Application\u Start()
中的当前代码块仅指定在首次访问期间创建数据库时要使用的策略


要在启动时触发数据库的创建,必须创建数据库上下文的实例,并且必须调用
context.database.Initialize(true)

我也遇到了同样的问题,并找到了一个优雅的解决方案:在DbContext的构造函数中调用SetInitializer:

public class MyDbContext : DbContext
{
   protected MyDbContext : this("MyConnection")
   {
       Database.SetInitializer<MyDbContext>(new CreateDatabaseIfNotExists<MyDbContext>());
   }
}
公共类MyDbContext:DbContext
{
受保护的MyDbContext:此(“MyConnection”)
{
SetInitializer(新的CreateDatabaseIfNotExists());
}
}
我的应用程序设置:

<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>

我知道马扎苏已经以最正确的方式回答了这个问题。 但我想澄清一下: 根据mazatsushi的回答,你要做的是写:

        Database.SetInitializer(new DropCreateDatabaseIfModelChanges<SorteoContext>());
        using (var context = new SorteoContext())
        {
            context.Database.Initialize(force: true);
        }
Database.SetInitializer(新的DropCreateDatabaseIfModelChanges());
使用(var context=new SorteoContext())
{
context.Database.Initialize(强制:true);
}
Global.asax.cs中的内部应用程序_Start()函数
轰!工作

你的数据库是否是在服务器上创建的?如果我能为此投票不止一次,我会。。。我想这不会编译,因为它会有错误:protected MyDbContext:this(“MyConnection”)“MyConnection”是一个配置项我想他指的是“this”位。它应该是基底(“MyConnection”)