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

来源:互联网 发布:淘宝如何让排名靠前 编辑:程序博客网 时间:2024/06/09 03:32
Entity Framework code first migrations(迁移) 允许我们基于实体来创建和更新数据库. Entity Framework5 code first migrations只能更新一个DbContext. Now, Entity Framework6 code first migrations 现在可以针对每个数据库实例更新多个DbContext。 下面我们看看在EF6中如何实现该功能.

原文链接:http://www.dotnet-tricks.com/Tutorial/entityframework/2VOa140214-Entity-Framework-6-Code-First-Migrations-with-Multiple-Data-Contexts.html

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
阅读全文
1 0