上一篇文章中介绍了一个简单的可以运行起来的例子,旨在为了让大家快速熟悉EF的一个大概。然而我们的模型不可能一次就建立好,可以会涉及到多次的修改,而如何修改并使之应用到数据数据库,便是本篇着重想要介绍的。
1 对Model中添加一列
public class Blog { public int BlogId { get; set; } public string Name { get; set; } public string Url { get; set; } public string Title { get; set; } //添加一个属性Title public virtual List<Post> Posts { get; set; } }
首先,需要在Nuget中输入以下命令允许数据库迁移操作。
PM> enable-migrations
然后数据库中就会自动生成一个名为Migrations的文件夹,里面包含两个文件,分别是Configuration.cs及<timestamp>_InitialCreate.cs的文件。
- Configuration.cs - 该文件包含应用的迁移设置,一般不需要改任何东西
- <timestamp>_InitialCreate.cs - 该文件包含了从一个空数据库到包括已经生成表之间应用的变化
为了将刚添加的一列应用于数据库,需要输入以下命令。
PM> add-migration AddTitle
这时项目就会生成一个名为AddTitle的类,用来对Blogs表中添加Title属性。(生成不准确时需要人为修改,当然在这里是不需要的)
public partial class AddTitle : DbMigration { public override void Up() { AddColumn("dbo.Blogs", "Title", c => c.String(unicode: false)); } public override void Down() { DropColumn("dbo.Blogs", "Title"); } }
然后输入以下命令将模型更改应用于现有的数据库,可以通过命令后加-Verbose来查看具体执行的sql语句。
PM> update-database -Verbose
alter table `Blogs` add column `Title` longtext INSERT INTO `__MigrationHistory`( `MigrationId`, `ContextKey`, `Model`, `ProductVersion`) VALUES ( '201505280245036_AddTitle', 'CodeFirstSample.BloggingContext',
这时可以查看数据库表信息,已经有了名为Title的列。
2 更改模型中某列的名称
如将Post中的Title属性更改为TitleP。
public class Post { public int PostId { get; set; } public string TitleP { get; set; } //从Title更改到TitleP public int BlogId { get; set; } public virtual Blog Blog { get; set; } }
输入相关命令
PM> add-migration ChangeTitle
将会生成相应的类ChangeTitle,如下所示。
public partial class ChangeTitle : DbMigration { public override void Up() { AddColumn("dbo.Posts", "TitleP", c => c.String(unicode: false)); DropColumn("dbo.Posts", "Title"); } public override void Down() { AddColumn("dbo.Posts", "Title", c => c.String(unicode: false)); DropColumn("dbo.Posts", "TitleP"); } }
使用Update-Database命令将更忙应用于数据库,再查看数据库中表的信息,已经更改为名为TitleP。
3 删除模型某个属性
如需要删除刚在Bolg中添加Title属性,首先修改Model如下:
public class Blog { public int BlogId { get; set; } public string Name { get; set; } public string Url { get; set; } //public string Title { get; set; } //删除 public virtual List<Post> Posts { get; set; } }
然后输入相关命令
PM> add-migration DeleteTitle
项目就会生成相应的数据库迁移类DeleteTitle
public partial class DeleteTitle : DbMigration { public override void Up() { DropColumn("dbo.Blogs", "Title"); } public override void Down() { AddColumn("dbo.Blogs", "Title", c => c.String(unicode: false)); } }
输入数据库更新命令将会将模型变化应用于当前数据库。
4 添加模型
如添加模型User并修改BloggingContext。
public class User {
[Key] public string Name { get; set; } public string DisplayName { get; set; } } [DbConfigurationType(typeof(MySqlEFConfiguration))] public class BloggingContext : DbContext { public DbSet<Blog> Blogs { get; set; } public DbSet<Post> Posts { get; set; } public DbSet<User> Users { get; set; } }
输入命令并更新数据库便在数据库中添加了名为Users的表。
PM> add-migration AddUser
模型的更新及删除同更新删除模型中单独的一个属性。
5 命令使用总结
之前使用时一直误以为add-migration 后面的名称需要和命令相匹配,其实不然,任意字符串均可,EF会自动检测模型中的变化,并生成相应的迁移代码。