Entity FrameWork之CodeFirst 代码优先模式(5)------数据迁移

如何解决数据迁移策略,导致的数据库内容的丢失?

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);

注意:
但这种解决方案,需要手动配置实体类和数据表使其一致

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值