【问题标题】:Entity Framework Not Creating Database实体框架不创建数据库
【发布时间】:2011-09-28 02:13:23
【问题描述】:

一直在使用 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; }
    }
}

我在全局 web.config 文件中添加了一个 SQL 连接字符串,如下所示:

<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);
}

【问题讨论】:

  • 你的数据库是在服务器上创建的吗?

标签: visual-studio-2010 entity-framework asp.net-mvc-3 ef-code-first sql-server-2008-r2


【解决方案1】:

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

Entity Framework 在第一次访问之前不会创建数据库。 Application_Start()中的当前代码块仅指定了首次访问时创建数据库时使用的策略。

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

【讨论】:

  • 如果我可以为此投票不止一次,我会... 尝试进行数据库更新并不断收到关于没有数据库的错误,只需要运行一次应用程序
【解决方案2】:

我有同样的问题并找到了一个优雅的解决方案:在 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>

【讨论】:

  • 我认为这不会编译,因为它会有错误:protected MyDbContext : this("MyConnection")
  • 'MyConnection' 是一个配置条目
  • 我认为他指的是“这个”位。它应该是 base("MyConnection")
【解决方案3】:

我知道 mazatsushi 已经以最正确的方式回答了这个问题。 但只是为了向初学者澄清: 根据 mazatsushi 的回答,你要做的就是写:

        Database.SetInitializer(new DropCreateDatabaseIfModelChanges<SorteoContext>());
        using (var context = new SorteoContext())
        {
            context.Database.Initialize(force: true);
        }

Global.asax.cs 中的 Application_Start() 函数内部 和繁荣!有效!

【讨论】:

    猜你喜欢
    • 2019-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多