如何解决数据迁移策略,导致的数据库内容的丢失?
EF提供了一个新的数据库初始化器 MigrateDatabaseToLastestVersion,这个工具在实体模型改变时自动帮我们更新数据库,且不会造成数据丢失
下面介绍一种更新数据库的方法:
自动迁移:
1.在VS中,工具->NuGet包管理器->程序包管理器控制台:
执行下面的代码:
enable-migrations –EnableAutomaticMigration:$true
执行完成后,会自动生成Migrations文件夹以及一个Configuration类:
修改此类: 设置AutomaticMigrationDataLossAllowed为true
namespace EntityFrameCodeFirst.Migrations
{
using System;
using System.Data.Entity;
using System.Data.Entity.Migrations;
using System.Linq;
internal sealed class Configuration : DbMigrationsConfiguration<EntityFrameCodeFirst.Models.SchoolCRMEntities>
{
public Configuration()
{
AutomaticMigrationsEnabled = true;//开启自动迁移
//允许数据丢失,默认没有生成,只在添加/修改实体类属性时会自动生成
//如果删除实体类的一个属性,就会抛出异常
AutomaticMigrationDataLossAllowed = true;
ContextKey = "EntityFrameCodeFirst.Models.SchoolCRMEntities";
}
protected override void Seed(EntityFrameCodeFirst.Models.SchoolCRMEntities context)
{
// This method will be called after migrating to the latest version.
// You can use the DbSet<T>.AddOrUpdate() helper extension method
// to avoid creating duplicate seed data.
}
}
}
2.将数据库初始化器添加到自定义的数据库上下文类中:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.Entity;
using EntityFrameCodeFirst.Migrations;
namespace EntityFrameCodeFirst.Models
{
/// <summary>
/// 自定义数据库上下文类
/// </summary>
public class SchoolCRMEntities : DbContext
{
//通过base()调用父类构造:
//这种方式是读取App.Config配置文件中name属性值为SchoolCRMEntities的连接字符串信息
public SchoolCRMEntities() : base("name=SchoolCRMEntities")
{
//配置数据库初始化策略
//Database.SetInitializer<SchoolCRMEntities>(new DropCreateDatabaseIfModelChanges<SchoolCRMEntities>());
//添加MigrateDatabaseToLastestVersion数据初始化器
Database.SetInitializer(new MigrateDatabaseToLatestVersion<SchoolCRMEntities,Configuration>());
}
public DbSet<Student> Students { get; set; }
public DbSet<Grade> Grades { get; set; }
public DbSet<IDCard> IDCards { get; set;}
}
}
原始的数据库以及数据表记录:
执行测试:添加一条新的记录,执行成功
数据表中原来的数据还在,没有丢失,新的记录也被添加进来了.
还有一种方案:代码迁移,这里就不做陈述了.
具体看这里:代码迁移策略
还有一种方案:
当修改了实体类或者数据库上下文类中的属性时,修改数据库上下文的数据库初始化策略:
在对应的数据库上下文的构造器中:
//将EF自动建表的功能关闭掉--但需要手动配置实体类和数据表使其一致
Database.SetInitializer<SchoolContext>(null);
注意:
但这种解决方案,需要手动配置实体类和数据表使其一致