Entity Framework 6 Code First 多个Dbcontext的迁移方法

Entity Framework code first migrations(迁移) 允许我们基于实体来创建和更新数据库. Entity Framework5 code first migrations只能更新一个DbContext. Now, Entity Framework6 code first migrations 现在可以针对每个数据库实例更新多个DbContext。 下面我们看看在EF6中如何实现该功能.

Entity Framework code first migrations(迁移) 允许我们基于实体来创建和更新数据库. Entity Framework5 code first migrations只能更新一个DbContext. Now, Entity Framework6 code first migrations 现在可以针对每个数据库实例更新多个DbContext。 下面我们看看在EF6中如何实现该功能.

假设你有两个 DbContext, DataContext和UserDataContext. 你需要合并这两个DataContext到一个数据库实例中.

实体模型

   
   
  1. public class User
  2. {
  3. public int UserID { set; get; }
  4. public string FirstName { set; get; }
  5. public string LastName { set; get; }
  6. }
  7.  
  8. public class Role
  9. {
  10. public int RoleID { set; get; }
  11. public string RolesName { set; get; }
  12. }
  13.  
  14. public class Order
  15. {
  16. public int OrderID { set; get; }
  17. public int Quantity { set; get; }
  18. public double Amount { set; get; }
  19. public DateTime Date { set; get; }
  20. }

数据库上下文

   
   
  1. //first DbContext
  2. namespace MultiDataContextMigrations.Models
  3. {
  4. public class DataContext : DbContext
  5. {
  6. public DataContext()
  7. : base("DefaultConnection")
  8. {
  9.  
  10. }
  11.  
  12. protected override void OnModelCreating(DbModelBuilder modelBuilder)
  13. {
  14. //TODO:Define mapping
  15. }
  16.  
  17. public DbSet Users { get; set; }
  18. public DbSet Orders { get; set; }
  19. }
  20. }
  21. //second DbContext
  22. namespace MultiDataContextMigrations.Models
  23. {
  24. public class UserDataContext : DbContext
  25. {
  26. public UserDataContext():base("DefaultConnection")
  27. {
  28. }
  29. protected override void OnModelCreating(DbModelBuilder modelBuilder)
  30. {
  31. //TODO:Define mapping
  32. }
  33. public DbSet Users { get; set; }
  34. public DbSet Roles { get; set; }
  35. }
  36. }

实例1 : 一个项目中含有多个 DbContext

假设你在一个项目中含有两个DbContext,如下图:

在vs2012和vs2013的程序包管理控制台中,运行下面的命令可以分别将同一项目中的多个Dbcontex进行迁移:

   
   
  1. enable-migrations -ContextTypeName <DbContext-Name-with-Namespaces> -MigrationsDirectory:<Migrations-Directory-Name>
  2. Add-Migration -configuration <DbContext-Migrations-Configuration-Class-with-Namespaces> <Migrations-Name>
  3. Update-Database -configuration <DbContext-Migrations-Configuration-Class-with-Namespaces> -Verbose

迁移第一个 DbContext(DataContext)

   
   
  1. enable-migrations -ContextTypeName MultiDataContextMigrations.Models.DataContext -MigrationsDirectory:DataContextMigrations
  2. Add-Migration -configuration MultiDataContextMigrations.DataContextMigrations.Configuration Initial
  3. Update-Database -configuration MultiDataContextMigrations.DataContextMigrations.Configuration -Verbose

如果你在命令行执行了上面的命令,我们会看到如下的实际效果:

  1. 首先,一个迁移文件夹被创建,文件夹中有一个config类文件.

         
         
    1. internal sealed class Configuration : DbMigrationsConfiguration
    2. {
    3. public Configuration()
    4. {
    5. AutomaticMigrationsEnabled = false;
    6. //Helps to migrate this DbContext to database
    7. MigrationsDirectory = @"DataContextMigrations";
    8. }
    9. protected override void Seed(MultiDataContextMigrations.Models.DataContext context)
    10. {
    11. // This method will be called after migrating to the latest version.
    12. }
    13. }
  2. 第二,对应我们添加的迁移项,会生成一个类文件,显示更新的内容,本例中为创建表:

         
         
    1. public partial class Initial : DbMigration
    2. {
    3. public override void Up()
    4. {
    5. CreateTable(
    6. "dbo.Orders",
    7. c => new
    8. {
    9. OrderID = c.Int(nullable: false, identity: true),
    10. Quantity = c.Int(nullable: false),
    11. Amount = c.Double(nullable: false),
    12. Date = c.DateTime(nullable: false),
    13. })
    14. .PrimaryKey(t => t.OrderID);
    15. CreateTable(
    16. "dbo.Users",
    17. c => new
    18. {
    19. UserID = c.Int(nullable: false, identity: true),
    20. FirstName = c.String(),
    21. LastName = c.String(),
    22. })
    23. .PrimaryKey(t => t.UserID);
    24. }
    25. public override void Down()
    26. {
    27. DropTable("dbo.Users");
    28. DropTable("dbo.Orders");
    29. }
    30. }
  3. 第三,数据库中对应的表被生成.

迁移第二个 DbContext(DataContext)

   
   
  1. enable-migrations -ContextTypeName MultiDataContextMigrations.Models.UserDataContext -MigrationsDirectory:UserDataContextMigrations
  2. Add-Migration -configuration MultiDataContextMigrations.UserDataContextMigrations.Configuration Initial
  3. Update-Database -configuration MultiDataContextMigrations.UserDataContextMigrations.Configuration -Verbose

当你在程序包管理控制台窗口中执行上面命令,会有如下结果:

  1. 首先,会创建一个新的迁移文件夹和配置文件类.

         
         
    1. internal sealed class Configuration : DbMigrationsConfiguration
    2. {
    3. public Configuration()
    4. {
    5. AutomaticMigrationsEnabled = false;
    6. //Helps to migrate this DbContext to database
    7. MigrationsDirectory = @"UserDataContextMigrations";
    8. }
    9. protected override void Seed(MultiDataContextMigrations.Models.UserDataContext context)
    10. {
    11. // This method will be called after migrating to the latest version.
    12. }
    13. }
  2. 第二,对应我们添加的迁移项,会生成一个类文件,显示更新的内容,本例中为创建表

         
         
    1. public partial class Initial : DbMigration
    2. {
    3. public override void Up()
    4. {
    5. CreateTable(
    6. "dbo.Roles",
    7. c => new
    8. {
    9. RoleID = c.Int(nullable: false, identity: true),
    10. RolesName = c.String(),
    11. })
    12. .PrimaryKey(t => t.RoleID);
    13. CreateTable(
    14. "dbo.Users",
    15. c => new
    16. {
    17. UserID = c.Int(nullable: false, identity: true),
    18. FirstName = c.String(),
    19. LastName = c.String(),
    20. })
    21. .PrimaryKey(t => t.UserID);
    22. }
    23. public override void Down()
    24. {
    25. DropTable("dbo.Users");
    26. DropTable("dbo.Roles");
    27. }
    28. }
  3. 运行更新数据库命令之前,先注释掉生成user表的代码. 因为该表在上面的迁移代码中已经创建.

         
         
    1. public partial class Initial : DbMigration
    2. {
    3. public override void Up()
    4. {
    5. CreateTable(
    6. "dbo.Roles",
    7. c => new
    8. {
    9. RoleID = c.Int(nullable: false, identity: true),
    10. RolesName = c.String(),
    11. })
    12. .PrimaryKey(t => t.RoleID);
    13. //CreateTable(
    14. // "dbo.Users",
    15. // c => new
    16. // {
    17. // UserID = c.Int(nullable: false, identity: true),
    18. // FirstName = c.String(),
    19. // LastName = c.String(),
    20. // })
    21. // .PrimaryKey(t => t.UserID);
    22. }
    23. public override void Down()
    24. {
    25. DropTable("dbo.Users");
    26. DropTable("dbo.Roles");
    27. }
    28. }

    现在运行更新命令,会在上一个Dbcontex更新命令的基础上继续更新数据库。

__MigrationHistory表

这个表是迁移历史记录。我们简单看一下.

撤销/回滚 DbContexts 迁移

你可以使用下面一些列命令,对上面两个Dbcontex的迁移更新做回滚操作.

   
   
  1. Update-Database -configuration MultiDataContextMigrations.DataContextMigrations.Configuration -TargetMigration:"201402141616393_Initial" -verbose
  2. Update-Database -configuration MultiDataContextMigrations.UserDataContextMigrations.Configuration -TargetMigration:"201402141641408_Initial" -verbose

案例 2 :不同项目中的多个Dbcontex迁移

假设,你有如下图所示的两个Dbcontex,分别在不同的项目中.

在VS2012和VS2013中,执行下面的命令可以迁移在不同项目中的多个Dbcontex到同一数据库实例:

Syntax - EF Code First Migrations with Multiple DbContexts within different Projects
   
   
  1. enable-migrations -ProjectName:<ProjectName> -MigrationsDirectory:<Migrations-Directory-Name>
  2. add-migration <Migrations-Name> -ProjectName:<ProjectName>
  3. update-database -ProjectName:<ProjectName> -verbose

迁移第一个DbContext(DataContext)

   
   
  1. //migrating DataContext
  2. enable-migrations -ProjectName:DAL -MigrationsDirectory:DataContextMigrations
  3. add-migration InitialCreate -ProjectName:DAL
  4. update-database -ProjectName:DAL -verbose

迁移第二个DbContext(UserDataContext)

   
   
  1. //migrating UserDataContext
  2. enable-migrations -ProjectName:MultiDataContextMigrations -MigrationsDirectory:UserDataContextMigrations
  3. add-migration InitialCreate -ProjectName:MultiDataContextMigrations
  4. update-database -ProjectName:MultiDataContextMigrations -verbose

撤销/回滚DbContexts Migrations

   
   
  1. update-database -ProjectName:DAL -TargetMigration:"201401290826231_InitialCreate" -verbose
  2. update-database -ProjectName:MultiDataContextMigrations -TargetMigration:"201401290836540_InitialCreate" -verbose
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值