一步一步CodeFirst(二)

  上一篇文章中介绍了一个简单的可以运行起来的例子,旨在为了让大家快速熟悉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会自动检测模型中的变化,并生成相应的迁移代码。

posted @ 2015-05-28 13:41  magic249  阅读(139)  评论(0编辑  收藏  举报