您的位置:首页 > 其它

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

2016-12-01 16:05 507 查看
在微软官方关于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 默认会按照类型名复数建立数据表,比如说Student类对应的表名就叫Students.

(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.示例代码。新增与查询,输出见图5-1:

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             }




图5-1

3.运行程序后,生成的表结构如图5-2。可以发现Students表月Classes表生成了“一对多”的关系,和我们的预期一样。“__MigrationHistory”是ef自动生成的一张表,主要用于ef的一些配置信息,可以不用关心。



图5-2
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: