首页 > 代码库 > 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一个正确的解释