永远不会调用OnModelCreating

时间:2015-10-12 08:16:46

标签: c# entity-framework

我正在开始使用实体框架。 问题是我的OnModelCreating方法永远不会被调用。

这是我的上下文类:

public class TestContext : DbContext
    {
        public TestContext()
            : base("name=TestDBConnectionString")
        { }

        public DbSet<WorkItem> WorkItems { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
        }
    }

连接字符串

 <add name="TestDBConnectionString"
      connectionString="Data Source=(LocalDB)\v11.0;Initial Catalog=TestDB;Integrated Security=true"
      providerName="System.Data.SqlClient"/>

我希望在打电话时进入OnModelCreating:

 using (var context = new TestContext())
        {

        }

我犯错的地方?

3 个答案:

答案 0 :(得分:4)

在初始化派生上下文的模型时,但在锁定模型并用于初始化上下文之前,将调用此方法。

通常,只有在创建派生上下文的第一个实例时才调用此方法一次。然后缓存该上下文的模型,该模型适用于app域中上下文的所有其他实例。可以通过在给定的ModelBuidler上设置ModelCaching属性来禁用此缓存,但请注意,这会严重降低性能。
MSDN

如果数据库不存在,它将使用编译模型中的信息来创建它。每个应用程序仅创建一次模型。使用Database First方法时,永远不会调用OnModelCreating。它永远不会被调用,因为EDMX中已经存在所有映射,因此从不使用Code First和DbModelBuilder。

尝试在进行SetInitializer调用之前调用静态初始值设定项:

using (var context = new TestContext())
{
    Database.SetInitializer(new CreateDatabaseIfNotExists<EntityContext>());
    context.Database.Initialize(true);
}

答案 1 :(得分:2)

尝试在上下文中添加新实体并持续更改。

using (var context = new TestContext())
{
    context.WorkItem.Add(new WorkItem()); //Construct valid entity
    context.SaveChanges();
}

默认情况下,如果数据库不存在,它将尝试创建数据库。或至少会抛出异常。

或者您可以强制它在启动时创建数据库

  

context.Database.Initialize(真);

https://msdn.microsoft.com/en-us/library/system.data.entity.database.initialize(v=vs.113).aspx

答案 2 :(得分:0)

在我的情况下,这种情况正在发生,因为我离开了{get;组;关闭我的DBSet声明。花了一段时间来搞清楚这一点!