【问题标题】:EF6 OnModelCreating() event doesntEF6 OnModelCreating() 事件没有
【发布时间】:2015-03-21 01:06:40
【问题描述】:

我正在学习有关 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 迁移?

【问题讨论】:

  • 您实际上是在哪里调用会进行数据库调用的方法?您的模型只有在第一次被访问时才会被创建。
  • 我在 HomeController 中添加了为此目的实例化 SchoolContext 数据库的构造函数。我实际上在完全工作的 EF 教程示例中设置了相同的断点,它在相同的确切点(构造函数)命中数据库,然后触发 OnModelCreating 事件。

标签: asp.net-mvc entity-framework entity-framework-6


【解决方案1】:

本文为您提供了另一种选择。尝试通过代码添加初始化策略的替代方法,看看是否有效。

在 Web.config 文件中设置初始化程序的另一种方法是在代码中通过将 Database.SetInitializer 语句添加到 Global.asax.cs 文件中的 Application_Start 方法来完成。

Database.SetInitializer(new CreateDatabaseIfNotExists<SchoolContext>());

并在 cmets 中指定。对数据运行查询或按照“设置 EF 以使用测试数据初始化数据库”部分自动为数据库播种。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2018-01-07
      • 1970-01-01
      • 2016-02-19
      • 1970-01-01
      • 2023-03-03
      • 2016-09-09
      • 1970-01-01
      • 2016-05-03
      • 2014-11-09
      相关资源
      最近更新 更多