Entity Framework入门

来源:互联网 发布:网络推广好处 编辑:程序博客网 时间:2024/05/23 16:25

Entity Framework入门

准备工作
如果使用的visual studio 2010,可安装NuGet Package Manager包管理工具

然后使用NuGet程序包管理器来安装 EntityFramework。安装之后,引用中就存在 EntityFramework

三种不同的approach:

  • Database First-参考Part 1 - What is Entity Framework,Database First 从一个已存在的数据库逆向生成一个模型
  • Model First-参考Part 2 - Entity Framework Model First Approach,Model First从EF设计器中创建的模型生成数据库
  • Code First-参考Part 3 - Entity Framework Code First Approach

推荐教程:

  • 《Entity Framework 6 Recipes》中文翻译系列

基础

上下文对象

上下文对象(context object)的。上下文对象是实体框架服务的入口,它暴露实体对象,管理数据库连接,生成参数化的SQL语句,从数据库中封送(marshals)数据或封送数据到数据库,缓存对象,维护对象变化跟踪,把无类型的结果集转换到一个强类型的集合对象。

一开始,上下文对象为ObjectContext对象,现在,实体框架支持另一个最新的名为DbContext的上下文对象。DbContext大大简单化了使用实体框架的体验。有趣的是,DbContextObjectContext的一个包装器或者外观实现者。以一种直观的、友好的、有效的方式暴露底层ObjectContext的功能。

Model First

Model First首先创建Entity Model,包括
1.Entites
2.Entites之间的关系
3.继承层级等

如下,在设计器中创建好实体模型EmployeeModel.edmx

实体模型

然后,在设计页面上选择”根据模型生成数据库”,选择”您的数据库连接”后,生成EmployeeModel.edmx.sql,其中的SQL包括:
1.创建对应的表
2.创建主键、外键
3.创建索引

EmployeeModel.edmx.sql中,右键”执行SQL”,执行SQL语句

Code First

Code First允许我们先创建自定义的类,然后Entity Framework会基于这些自定义的类来自动生成数据库
具体的例子请参考Part 3 - Entity Framework Code First Approach

自定义表名、列名和外键名

上面使用Code First来生成了DepartmentsEmployees 表。注意EmployeesDepartment_Id列名,有一个下划线。如果要使列名没有下划线该怎么呢?
这里写图片描述

使用System.ComponentModel.DataAnnotations.Schema命令空间的ForeignKey 属性

同样,为自定义表名和列名,也可进行类似的操作。

[Table("tblEmployees")]public class Employee{    public int Id { get; set; }    [Column("First_Name")]    public string FirstName { get; set; }    public string LastName { get; set; }    public string Gender { get; set; }    public int Salary { get; set; }    public int DepartmentId { get; set; }    [ForeignKey("DepartmentId")]    public Department Department { get; set; }}

数据库创建后如何处理模型的变化

参考Part 5 - How to handle model changes in entity framework

如果在Employee类中添加一个新的属性

public string JobTitle { get; set; }

此时运行程序,提示如下的错误:

The model backing the 'EmployeeDBContext' context has changed since the database was created. Consider using Code First Migrations to update the database (http://go.microsoft.com/fwlink/?LinkId=238269).

这是因为创建数据库后,模型(即Employee类)已更改。这意味着模型和数据库不再同步,因此会报错。entity framework使用自动生成的__MigrationHistory表,检查创建数据库后模型是否已更改。

为了解决这个错误,我们必须告诉实体框架当模型改变时该怎么做?
添加一个Global.asax文件,在Application_Start() 方法中,添加如下的代码,表示model改变后,Entity framework会删除并重新创建数据库

        protected void Application_Start(object sender, EventArgs e)        {            Database.SetInitializer(new DropCreateDatabaseIfModelChanges<EmployeeDBContext>());        }

另一种方式是,总是删除并重新创建数据库

Database.SetInitializer(new DropCreateDatabaseAlways<EmployeeDBContext>());