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)
我犯错误的地方?
当派生上下文的模型已初始化时,但在模型被锁定并用于初始化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)
尝试向上下文添加新实体并保留更改。
喜欢
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