我正在开始使用实体框架。 问题是我的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())
{
}
我犯错的地方?
答案 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声明。花了一段时间来搞清楚这一点!