准备工作
如果使用的visual studio 2010,可安装NuGet Package Manager
包管理工具
然后使用NuGet程序包管理器来安装 EntityFramework
。安装之后,引用中就存在 EntityFramework
三种不同的approach:
Database First
从一个已存在的数据库逆向生成一个模型Model First
从EF设计器中创建的模型生成数据库推荐教程:
上下文对象
上下文对象(context object)的。上下文对象是实体框架服务的入口,它暴露实体对象,管理数据库连接,生成参数化的SQL语句,从数据库中封送(marshals)数据或封送数据到数据库,缓存对象,维护对象变化跟踪,把无类型的结果集转换到一个强类型的集合对象。
一开始,上下文对象为ObjectContext
对象,现在,实体框架支持另一个最新的名为DbContext
的上下文对象。DbContext
大大简单化了使用实体框架的体验。有趣的是,DbContext
是ObjectContext
的一个包装器或者外观实现者。以一种直观的、友好的、有效的方式暴露底层ObjectContext
的功能。
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允许我们先创建自定义的类,然后Entity Framework会基于这些自定义的类来自动生成数据库
具体的例子请参考Part 3 - Entity Framework Code First Approach
上面使用Code First来生成了Departments
和Employees
表。注意Employees
表Department_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());
}
另一种方式是,总是删除并重新创建数据库
Database.SetInitializer(new DropCreateDatabaseAlways());