CodeFirst New Database 使用Migration 和Fluent API

☆樱花仙子☆ 提交于 2020-03-08 08:37:43

先决条件:

安装了VS2010或者VS2012.

如果使用VS2010,则需要手动安装NuGet.

 

1、创建应用程序

创建一个控制台应用程序,命名为:CodeFirstNewDatabaseSample

2、创建实体类

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

 

3、创建上下文

    上下文代表和数据库之间的会话,创建一个继承System.Data.Entity.DbContext 的类 并且为实体类添加DbSet<TEntity>属性。

    使用NuGet添加Entity Framework支持。

   工程--管理NuGet程序包,添加最新的EntityFramework支持。

   选择联机

   选择EntityFramework

   点击安装

   在Program的顶部添加using System.Data.Entity;

  

public class BlogContext : DbContext
{
    public DbSet<Blog> Blogs { get; set; }
    public DbSet<Post> Posts { get; set; }
 
}

  

4 创建和读取数据

static void Main(string[] args)
        {
            using (var db = new BlogContext())
            {
                Console.Write("Enter a blog name:");
                var name = Console.ReadLine();
  
                var blog = new Blog { Name = name };
                db.Blogs.Add(blog);
                db.SaveChanges();
  
                Console.WriteLine("All blogs in database...");
                var query = from b in db.Blogs
                            orderby b.Name
                            select b;
                foreach (var b in query)
                {
                    Console.WriteLine(b.Name);
                }
  
                Console.WriteLine("Press any key to exit");
                Console.ReadKey();
            }
        }

  运行程序会看到下图

   

    

数据放在那里?

使用LocalDb查看数据(LocalDb在安装VS2012时已经安装)

视图--Sql Server对象资源管理器

图中已可以看到新建的数据库BlogContext

 

5、处理实体类更改

    在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

 

 

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

 

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.

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!