zoukankan      html  css  js  c++  java
  • 一步一步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会自动检测模型中的变化,并生成相应的迁移代码。

  • 相关阅读:
    POJ 1142 Smith Numbers
    POJ 1171 Letter Game 解题思路
    人人德克萨斯牌出手规则整理
    OpenMP相关知识索引
    如何进行有效的沟通
    台哥算法练习:一个for循环打印九九乘法表
    啊哈,381654729!
    发牌的小窍门
    判断数abcdef能否被k整除(k属于[2,9])
    如何在数轴上找到一个数的倒数
  • 原文地址:https://www.cnblogs.com/maigc249/p/4535678.html
Copyright © 2011-2022 走看看