EF Code First 数据迁移

背景:

EF Code First在经历新业务或者业务逻辑变更时,可能会遇到数据库的更改,比如新增表

,更改表加字段,等等。这个时候,删除原来的数据库重建会丢失数据。

方案1:

如果初次开发,可以选择删除重建。

代码:

public TestDbContext()
: base("Name=TestConnection")
{
Database.SetInitializer<TestDbContext>(new DropCreateDatabaseIfModelChanges<TestDbContext>());
}

方案2:

使用EF代码迁移工具。

1,通过NugGet向项目添加EF,同时系统会添加一个迁移工具

2,Web.config或App.Config配置很重要,迁移工具会根据<entityFramework>节点寻找需要更新的数据库,如果是<defaultConnectionFactorytype="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">会寻找本地数据库,如果是<defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" >会寻找远程数据库。当然这里还可以有其他配置,比如Oracle的配置。

3,自定义的DbContext的无参数构造函数必须指定连接串:(数据上下文的类名就是连接串的名称)

<add name="TestDbContext " connectionString="Data Source=(loacl); Database=Northwind; User ID=sa; Password=123456;" providerName="System.Data.SqlClient"/>

public class TestDbContext : DbContext
{

public TestDbContext()
{
Database.SetInitializer<TestDbContext>(new DropCreateDatabaseIfModelChanges<TestDbContext>());
//Database.SetInitializer<TestDbContext>(null);
}

迁移工具会根据这个构造函数寻找数据库连接,默认的连接串为VS的MSLoaclDb数据库实例,这个地方需要注意。

4,准备好之后就可以开始迁移了,打开程序包管理器控制台。分三步输入指令:(示例如下)

PM> Enable-migrations
正在检查上下文的目标是否为现有数据库...
已为项目 MvcTestKO 启用 Code First 迁移。
PM> Add-Migration v1
正在为迁移“v1”搭建基架。
此迁移文件的设计器代码包含当前 Code First 模型的快照。在下一次搭建迁移基架时,将使用此快照计算对模型的更改。如果对要包含在此迁移中的模型进行其他更改,则您可通过再次运行“Add-Migration v1”重新搭建基架。
PM> Update-Database
指定“-Verbose”标志以查看应用于目标数据库的 SQL 语句。
正在应用显式迁移: [201903300817195_v1]。
正在应用显式迁移: 201903300817195_v1。

说明:

Enable-migrations后会生成一个迁移文件夹,里面会记录版本更迭状况

public partial class v1 : DbMigration
    {
        public override void Up()
        {
            CreateTable(
                "dbo.TestChilds",
                c => new
                    {
                        Id = c.String(nullable: false, maxLength: 128),
                        createTime = c.DateTime(nullable: false),
                    })
                .PrimaryKey(t => t.Id);
            
        }
        
        public override void Down()
        {
            DropTable("dbo.TestChilds");
        }
    }
    public partial class v2 : DbMigration
    {
        public override void Up()
        {
            AddColumn("dbo.TestChilds", "Name", c => c.String());
        }
        
        public override void Down()
        {
            DropColumn("dbo.TestChilds", "Name");
        }
    }

Add-Migration v1 添加一个命名为v1的版本,添加好后会生成一个名叫 201903300817195_v1.cs的类。

PM> Update-Database 将迁移更新到数据库。更新完后,查看数据库会有更新 ,并且数据库的[__MigrationHistory]表会有相应的记录。

 

转载于:https://www.cnblogs.com/cooolyuxyz/p/10629531.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用 Entity Framework Code First 可以方便地创建数据表。以下是基本步骤: 1.创建一个继承自 DbContext 的类,该类代表数据库上下文。 2.定义一个实体类,该类代表数据库中的一个表。在实体类上使用数据注解或 Fluent API,来指定表名、列名、数据类型、主键、外键等信息。 3.在数据库上下文类中,使用 DbSet 属性将实体类与数据库上下文关联起来。 4.创建一个数据库初始化类,该类继承自 DropCreateDatabaseIfModelChanges 或 CreateDatabaseIfNotExists,用于在应用程序启动自动创建数据库和表。 5.在应用程序启动,使用数据库初始化类的静态方法,来初始化数据库。 以下是一个示例: ```csharp // 1.创建数据库上下文 public class MyDbContext : DbContext { public DbSet<User> Users { get; set; } } // 2.定义实体类 public class User { public int Id { get; set; } public string Name { get; set; } public int Age { get; set; } } // 3.在数据库上下文中关联实体类 public class MyDbContext : DbContext { public DbSet<User> Users { get; set; } } // 4.创建数据库初始化类 public class MyDbInitializer : DropCreateDatabaseIfModelChanges<MyDbContext> { protected override void Seed(MyDbContext context) { // 初始化数据 context.Users.Add(new User { Name = "Tom", Age = 20 }); context.Users.Add(new User { Name = "Jerry", Age = 22 }); base.Seed(context); } } // 5.在应用程序启动初始化数据库 Database.SetInitializer(new MyDbInitializer()); ``` 运行应用程序后,EF Code First 将会自动创建名为 MyDbContext 的数据库,并在其中创建一个名为 Users 的表,该表包含 Id、Name 和 Age 三列。同数据库初始化类 MyDbInitializer 会在数据库创建后,向 Users 表中插入两条初始化数据

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值