在Code First中使用Migrations对实体类和数据库做出变更

时间:2022-11-27 22:35:02

在Code First中使用Migrations对实体类和数据库做出变更,Mirgration包含一系列命令。

工具--库程序包管理器--程序包管理器控制台

运行命令:Enable-Migrations 启用Code first Migration

运行成功后会产生两个类:Configuration.cs  和<timestamp>_InitialCreate.cs,这是一个用时间戳作为前缀的类。如201212310201487_InitialCreate.cs

  然后更改实体类Blog,增加一个属性Url

 

  public class Blog    {        public int BlogId { get; set; }        public String Name { get; set; }        public String Url { get; set; }        public virtual List<Post> Posts { get; set; }    }

 运行命令:Add-Migration AddUrl,运行成功后会产生一个类:201212310209000_AddUrl.cs

在Code First中使用Migrations对实体类和数据库做出变更

运行命令:Update-Database,该命令运行成功后,更改属性将会映射到数据库。在SQL Server资源管理中刷新数据库查看变更。

在Code First中使用Migrations对实体类和数据库做出变更

6:Data Annotations

到目前为止我们使用EF发现实体类都是使用默认的行为,有很多行为不符合我们的要求,所以我们使用Data Annotations和 fluent API解决这个问题。

先添加一个User类,然后更新BlogContext:

 public class User    {        public String Username { get; set; }        public String DisplayName { get; set; }            }

  如果当前我们使用migration命令去变更数据库,则会提示错误:“EntityType ‘User’ has no key defined. Define the key for this EntityType”,因为EF没有办法知道Username应该是User表的主键,在Program顶部添加代码:using System.ComponentModel.DataAnnotations; 然后给Username属性添加属性Key

   public class User    {        [Key]        public String Username { get; set; }        public String DisplayName { get; set; }            }

 运行命令:Add-Migration AddUser将变更映射到数据库。运行成功后会产生一个类:201212310235372_AddUser.cs

public partial class AddUser : DbMigration    {        public override void Up()        {            CreateTable(                "dbo.Users",                c => new                    {                        Username = c.String(nullable: false, maxLength: 128),                        DisplayName = c.String(),                    })                .PrimaryKey(t => t.Username);                    }                public override void Down()        {            DropTable("dbo.Users");        }    }

  运行命令:Update-Database将新的迁移映射到数据库,此时查看数据库会产生User表。

7、Fluent API

如果我们需要更变列名,则使用FluentAPI, 如果我们需要把User表的DisplayName改为Display_name.在BlogContext中重写OnModelCreating:

protected override void OnModelCreating(DbModelBuilder modelBuilder){      modelBuilder.Entity<User>()          .Property(u=>u.DisplayName)          .HasColumnName("Display_name");}

 运行命令:Add-Migration ChangeDisplayName.

运行命令:Update-Database.

查看User表已更新字段Display_name.