在使用EF Code First的时候可以通过代码自动生成数据库,然而一般系统生成的数据库需要有初始数据
在继承DbContext类中覆盖默认CreateDatabaseIfNotExists策略
public Db()
: base("name = DynamicForm") // 这里的name必须和Web.config里面的相同
{
//那么无论什么时候更新实体模型,EF都会自动地更新数据库模式。这里很重要的一点是,这种策略更新数据库模式不会丢失数据,或者是在已有的数据库中更新已存在的数据库对象。
// 覆盖默认的CreateDatabaseIfNotExists初始器
// 需要两个参数,第一个参数为继承DbContext的类, 第二个参数为Migrations中的配置类
Database.SetInitializer<Db>( new MigrateDatabaseToLatestVersion<Db,Migrations.Configuration>() );
}
Migrations.Configuration
public Configuration()
{
AutomaticMigrationsEnabled = true; // 自动迁移
ContextKey = "RestfulDynamicForm.Models.Db";
}
这里的目的是当更改数据库结构的时候,直接在原有数据库保存数据的前提下更新结构,
首先创建一个类名为DatabaseInitializer的类
/*CreateDatabaseIfNotExists:顾名思义,如果数据库不存在,那么就重新创建,否则就使用现有的数据库。如果从领域模型中提取到的模式信息和实际的数据库模式不匹配,那么就会抛出异常。
DropCreateDatabaseAlways:如果使用了该策略,那么每次运行程序时,数据库都会被销毁。这在开发周期的早期阶段通常很有用(比如设计领域实体时),从单元测试的角度也很有用。
DropCreateDatabaseIfModelChanges:这个策略的意思就是说,如果领域模型发生了变化(具体而言,从领域实体提取出来的模式信息和实际的数据库模式信息失配时),就会销毁以前的数据库(如果存在的话),并创建新的数据库。
MigrateDatabaseToLatestVersion:如果使用了该初始化器,那么无论什么时候更新实体模型,EF都会自动地更新数据库模式。这里很重要的一点是,这种策略更新数据库模式不会丢失数据,或者是在已有的数据库中更新已存在的数据库对象。
*/
public class DatabaseInitializer: DropCreateDatabaseAlways<Db>
{
protected override void Seed(Db context)
{
UserList userList = new UserList()
{
username = "xx",
password = "123",
groupsId = 1,
time = DateTime.Now,
formNum = 0,
personData = null
};
Unit unit = new Unit()
{
unitName = "管理员",
username = "xx",
time = DateTime.Now
};
try
{
context.UserList.Add(userList);
context.Unit.Add(unit);
context.SaveChanges();
}
catch(DbEntityValidationException dbEx) { }
base.Seed(context);
}
}
然后在Glolobal.asax里面添加 Database.SetInitializer<Db>(new DatabaseInitializer());
protected void Application_Start()
{
GlobalConfiguration.Configure(WebApiConfig.Register);
Database.SetInitializer<Db>(new DatabaseInitializer());
}
本文介绍了如何在使用Entity Framework Code First时添加初始数据。通过覆盖DbContext的CreateDatabaseIfNotExists策略,并创建自定义的DatabaseInitializer类,可以在不丢失已有数据的情况下更新数据库结构。在Global.asax中设置Database.SetInitializer来启用这个初始化过程。
1816

被折叠的 条评论
为什么被折叠?



