通过启用迁移和更新数据库可以很容易的生成一张表。但是对数据库修改之后,通过数据迁移就没那么好实现了。
这里用到数据库生成策略,进行对数据库操作:
一、3种主要数据库生成策略
1 CreateDatabaseIfNotExists 方法会在没有数据库时创建一个,这是默认行为。
Database.SetInitializer(new CreateDatabaseIfNotExists<xxx>());
2 DropCreateDatabaseIfModelChanges 如果我们在在模型改变时,自动重新创建一个新的数据库,就可以用这个方法。在这开发过程中非常有用。
Database.SetInitializer(new DropCreateDatabaseIfModelChanges<xxx>());
3 DropCreateDatabaseAlways 如果你想在每次运行时都重新生成数据库就可以用这个方法。
Database.SetInitializer(new DropCreateDatabaseAlways<xxx>());
修改数据库之后重新生成数据库,推荐使用 DropCreateDatabaseAlways
详细用法:
1).Global.asax:Application_Start()方法中添加:
Database.SetInitializer<ManagementDBContext>(new DropCreateDatabaseAlways<ManagementDBContext>());
ManagementDBContext 为自己定义的Context上下文。
2).然后删除项目中启用数据迁移自动生成的文件夹:Migrations及下面所有内容
不删除会报一个The DropCreateDatabaseAlways initializer did not drop or create the database backing context ‘ManagementDBContext‘ because Migrations are enabled for the context. Use Migrations to manage the database for this context, for example by running the ‘Update-Database‘ command from the Package Manager Console. 错误。
3).最后在代码中使用db对象,即可重新生成数据库。
public ActionResult Index() { using (ManagementDBContext db = new ManagementDBContext()) { var result = db.Permissions.ToList(); } return View(); }
二、自定义生成策略
自定义策略主要用的自定义策略中重写的Seed方法。
可以在Seed方法中加一些初始数据,这样生成的时候就会生成初始数据。
public class ManagementDBContextInitializer : DropCreateDatabaseAlways<ManagementDBContext> { protected override void Seed(ManagementDBContext context) { base.Seed(context); var roles = new List<Role> { new Role{ RoleName="超级管理员", Description="Administrator" }, new Role{ RoleName="普通管理员", Description="Admin" } }; roles.ForEach(l => context.Roles.Add(l)); context.SaveChanges(); } }