本文主要介绍如何使用CodeFirst模式来新建并更新数据库
  在使用Entity Framwork的三种方式(ModelFist、DBFirst、CodeFirst)中,CodeFirst方式书写的代码为干净。
  至于CodeFist方式的详细优缺点请各位读者自行搜索,这里不多赘述。
  1. 使用CodeFirst方式创建数据库
  我们新建一个控制台项目,项目中添加两个Model:Author和Blog以及DbContext。 DbContext的添加方式如下:
  项目上右键->添加->新建项->ADO.NET Entity Data Model->Empty Code First model
  项目代码如下:
1 //默认生成的数据表名为类名+字母s,这里使用TableAttribute来指定数据表名为T_Authors
2     [Table("T_Authors")]
3     public class Author
4     {
5         public int Id { set; get; }
6         public string Name { set; get; }
7         /*
8         此处定义了Blog类型的属性,所以要确保Blog类中至少要有一个表示主键的字段,即public int Id { set; get; }。
否则在生成数据表时会报错:"EntityType 'Blog' has no key defined. Define the key for this EntityType.
9     Blogs: EntityType: EntitySet 'Blogs' is based on type 'Blog' that has no keys defined."
10     */
11         public virtual ICollection<Blog> Blogs { set; get; }
12     }
13
14     [Table("T_Blogs")]
15     public class Blog
16     {
17         public int Id { set; get; }
18         public string Title { set; get; }
19         public DateTime Time { set; get; }
20         public int AuthorId { set; get; }
21         public virtual Author Author { set; get; }
22     }
23
24     public class MyDbContext: DbContext
25     {
26          public MyDbContext()
27             : base("name=MyDbContext")
28         {
29         }
30         //DbContext会根据配置文件中connectionStrings指定的数据库名称来建立数据库
31         //DbContext根据DbSet属性的类型来创建数据表,这里指定了Author类型的属性,所以会生成T_Authors数据表
32         public virtual DbSet<Author> Authors { set; get; }
33     }
  CodeFirst方式会根据配置文件中的配置生成数据库,这里小编使用的是MYSQL数据库,配置文件如下:
1 <!--EF for MYSQL-->
2  <entityFramework codeConfigurationType="MySql.Data.Entity.MySqlEFConfiguration, MySql.Data.Entity.EF6">
3     <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
4     <providers>
5       <provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6" />
6     </providers>
7   </entityFramework>
8   <connectionStrings>
9     <add name="MyDbContext" connectionString="server=localhost;port=3306;database=EF;uid=root;password=root" providerName="System.Data.MySqlClient" />
10   </connectionStrings>
  PS:小编使用的是EF6和MYSQL数据库,所以要在项目中添加对Mysql.Data.Entity.EF6以及EntityFrameword 6.0的引用。
  到此,我们已经完成生成数据库的工作,接下来在Main方法中写两行代码:
  1 using (var db = new ManagerDb())
  2 {
  3     db.Authors.Add(new Author() { Name = "xfh" });
  4     db.SaveChanges();
  5 }
  运行程序,我们会发现EF已经为我们建立了数据库,数据库名称为EF(在配置文件中指定)以及数据表T_Authors。

  虽然我们没有为DbContext添加Blog类型的属性,但依然创建了数据表T_Blogs,这是因为在Author类中定义了Blog类型的属性,若我们注释掉
  public virtual ICollection<Blog> Blogs { set; get; } ,删除数据库重新生成会发现不在生成T_Blogs表。在生成T_Authors表的同时,会生成一张名为_migrationhistory表,这张表用于记录我们对于数据库的更新日志,表中的MigrationId字段的值是我们每次执行Migration时所生成的文件名,根据该字段的值我们可以使用命令 Update-Database -TargetMigration:MigrationIdValue 来将数据库恢复到MigrationIdValue所对应的Migration状态,和Git版本控制有点儿像,但这里若将数据库回滚到以前的版本会导致数据的丢失,并且_migrationhistory表也会删除所记录的当前Migration信息。