永远不会调用OnModelCreating

Ras*_*kov 8 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);
        }
    }
Run Code Online (Sandbox Code Playgroud)

连接字符串

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

我打算在打电话时进入OnModelCreating:

 using (var context = new TestContext())
        {

        }
Run Code Online (Sandbox Code Playgroud)

我犯错误的地方?

Cra*_*her 8

就我而言,发生这种情况是因为我离开了 { get; 放; } 关闭我的 DBSet 声明。花了一段时间才弄清楚!


Rom*_*syk 5

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

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

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

在进行SetInitializer调用之前,请尝试调用静态初始化程序:

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


Ube*_*Bot 4

尝试向上下文添加新实体并保留更改。

喜欢

using (var context = new TestContext())
{
    context.WorkItem.Add(new WorkItem()); //Construct valid entity
    context.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)

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

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

上下文.数据库.初始化(true);

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