本文主要介绍如何使用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信息。