首页 > 代码库 > entityframework学习笔记--005-给code first一个正确的解释

entityframework学习笔记--005-给code first一个正确的解释

在微软官方关于ef7的介绍中强调,ef7将舍弃database first、model first,只保留code first的使用。这引起了很多人的担忧,担忧源自对code first的错误理解。因为很多人认为code first是区别于database first与model first的第三种方式,其实这是错误的理解。其实code first是替代前两种方式的解决方案。换句话来说,Code First 不是相对 Database First 和Model First的第三种方式,而是一种可以替代EDMX文件格式的方案。从概念上讲,Code First 同时支持Database First和Model First工作方式。 这的确让人感到混乱,我们取错了名字。 或许叫它“基于代码建模(code-base modeling)”会更清晰些。这里有一篇关于ef7的介绍文档:https://msdn.microsoft.com/zh-cn/magazine/dn890367.aspx

1.首先为你的项目安装上entityframework,然后右键你的项目,添加两个实体类文件,类文件信息如下:

 1 public class Class
 2     {
 3         public int Id { get; set; }
 4         public string Name { get; set; }
 5         public virtual List<Student> Students { get; set; }
 6         public Class()
 7         {
 8             Students = new List<Student>();
 9         }
10     }
 1 public class Student
 2     {
 3         //[Key]
 4         public int Id { get; set; }
 5         public string Name { get; set; }
 6         public int ClassId { get; set; }
 7 
 8         //[ForeignKey("ClassId")]
 9         public virtual Class Class { get; set; }
10     }

1.2 在添加一个继承自DbContext的类,DbContext类是ef的数据访问核心。类信息如下:

 1 public class MyEfRecipesContext:DbContext
 2     {
 3         public MyEfRecipesContext()
 4         {
 5             //Database.SetInitializer(new CreateDatabaseIfNotExists<MyEfRecipesContext>());
 6         }
 7         public DbSet<Student> Students { get; set; }
 8         public DbSet<Class> Classs { get; set; }
 9 
10         protected override void OnModelCreating(DbModelBuilder modelBuilder)
11         {
12             //这里可以用于模型创建前的配置修改
13         }
14     }

上图中的注释代码是可以省略的,因为ef的默认配置就是这样。当然你可以手动更改配置信息。在ef中有一个原则“约定大于配置”,约定其实也就是默认配置,意思就是说ef中的约定最好不要主动去修改它。下面是ef的一些默认约定:

(1) 数据库映射:Code First 默认会在本地的SQL Expression数据库中建立一个和DbContext的子类的全名相同的数据库,全名指的是命名空间加上类名。当然后边会介绍怎么进行配置。

(2)表映射:Code First 默认会按照类型名复数建立数据表,比如说ProductCatalog类对应的表名就叫ProductCatalogs.后边会介绍如何改变默认的表名。

(3)列映射:Code First 默认会按照类中的属性名建立column,它还有默认的数据类型映射习惯,int会映射为interger,string会映射为nvarchar(max),decimal会映射为decimal(18,2)。后边会介绍如何更改column的名称,类型以及其他特性。

(4)主键映射:Code First 默认会在类的属性中需找名字为Id或类型名称+Id的int类型的属性作为主键,并且是自增字段。这些也是可以改的。

1.3 在App.config中添加配置文件,如果是Web程序配置文件则是Web.config,这个不用介绍了吧。连接字符串信息如下:

  <connectionStrings>
    <add name="MyEfRecipesContext" connectionString="Data Source=.;Initial Catalog=myefrecipes;User Id=sa;Password=renjing2000;MultipleActiveResultSets=True;" providerName="System.Data.SqlClient" />
  </connectionStrings>

2.示例代码,新增与查询:

 1 using (MyEfRecipesContext db = new MyEfRecipesContext())
 2             {
 3                 Class c1 = new Class() { Name = "class1" };
 4                 Student s1 = new Student() { Name = "rj1", Class = c1 };
 5                 Student s2 = new Student() { Name = "rj2", Class = c1 };
 6 
 7                 db.Students.Add(s1);
 8                 db.Students.Add(s2);
 9                 int i = db.SaveChanges();
10 
11                 Console.WriteLine("id\t姓名\t班级");
12                 foreach (var item in db.Students)
13                 {
14                     Console.WriteLine("{0}\t{1}\t{2}",item.Id,item.Name,item.Class.Name);
15                 }
16             }

entityframework学习笔记--005-给code first一个正确的解释