1、什么是迁移???
卧槽,就是为了在原模型中添加字段或者新增模型时不改变原有的数据的功能,当然可以手动通过数据库工具添加,直观嘛。
2、怎么判断数据库是否具有迁移功能?
简单。。。。。==>查看数据库中有没有 __MIgrationHistory 这个表,当然把它删除就不具备迁移功能了,通常EF+Codefirst模式都是自带数据迁移功能的,默认的,这就时创建“空的code first”时就是这个这样的
数据迁移步骤(Mysql举例)
1、安装MySql.Data.Entity(选择最新版本的)千万不要自己手动引用EntityFramework.dll这些,不然后面迁移不成功,这是个坑
2、安装后配置app.config,主要是修改连接字符串
<connectionStrings>
//Initial Catalog=HU:数据库名称
<add name="DefaultConnection" connectionString="Data Source=localhost;port=3306;Initial Catalog=HU;user id=root;password=admin;" providerName="MySql.Data.MySqlClient" />
</connectionStrings>
3、新建实体类,比如新建一个学生和老师的实体类,相关引用自己添加了
public class Student
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int ID { get; set; }
public string StudentName { get; set; }
public int ClassTeacherID { get; set; }
[ForeignKey("ClassTeacherID")]
public virtual Teacher ClassTeacher { get; set; }
}
public class Teacher
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int ID { get; set; }
public string TeacherName { get; set; }
//InverseProperty:争对两个内互相有联系的情况下使用
[InverseProperty("ClassTeacher")]
public virtual ICollection<Student> Students { get; set; }
}
4、新建上下文BaseDbContext,继承DbContext,其他属性设置可以自己添加
需要注意一定要添加上[DbConfigurationType(typeof(MySql.Data.Entity.MySqlEFConfiguration))]
[DbConfigurationType(typeof(MySql.Data.Entity.MySqlEFConfiguration))]
public class BaseDbContext:DbContext
{
public BaseDbContext():base("DefaultConnection")
{
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
// 禁用默认表名复数形式
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
//禁用多级连接修改从库数据
//modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
//modelBuilder.Configurations.AddFromAssembly(typeof(BaseDbContext).Assembly);
base.OnModelCreating(modelBuilder);
}
public virtual DbSet<Student> StudentInfo { get; set; }
public virtual DbSet<Teacher> TeacherInfo { get; set; }
}
5、打开 “工具—NuGet包管理器—程序包管理控制平台”
输入 Enable-Migrations
如果有多个上下文类,则用这个
Enable-Migrations -ProjectName xxx -StartUpProjectName xxx -ContextTypeName xxxxDbContext -MigrationsDirectory:Migrations
//xxx:安装到那个命名空间下,xxxxDbContext:针对哪一个上下文
安装好之后生成Configuration类,此时需要修改自动迁移和自动迁移丢失都为true
//自动迁移
AutomaticMigrationsEnabled = true;
//自动迁移数据丢失
AutomaticMigrationDataLossAllowed = true;
6、在控制台下接着输入:Add-Migration v1
其中的v1表示版本号,自己随便取一个名字就可以了
7、最后更新一下输入:Update-Database
8、如果新增了一个字段或者类,那么就执行一次Add-Migration v2,相当于更新了哈版本号,然后更新一下即可,
这样做的好处就是不损坏原有数据的情况下,数据库不会报错
巨坑:项目一定要用.Net FrameWork4.5.2版本以上的,主要是低版本的Mysql.data不行,研究了很久