使用实体数据
实体框架 将概念模型和存储模型元数据以及这两个模型之间的映射编译成称为“客户端视图”**的双向 Entity SQL 语句对。 这些视图驱动运行时引擎中的查询和更新处理。 当针对概念模型执行第一个查询时,可以在设计时或运行时调用生成视图的映射编译器。
实体框架 通过提供到基础数据提供程序和数据源的 EntityConnection,建立在特定于存储的 ADO.NET 数据提供程序的基础之上。
执行查询时,查询将被解析并转换为规范化命令目录树,该规范化命令目录树是查询的对象模型表示形式。 规范命令目录树表示选择、更新、插入和删除命令。 所有后续处理将在命令目录树上执行,命令目录树是 System.Data.EntityClient 提供程序和基础 .NET Framework 数据提供程序(如 System.Data.SqlClient)的通信途经。
下图演示用于访问数据的实体框架体系结构:
查询对象
ADO.NET 实体数据模型工具生成一个类,该类派生自表示概念模型中定义的实体容器的 ObjectContext。 ObjectContext 类支持针对概念模型的查询,这些查询以对象的形式返回实体,该类还支持创建、更新和删除实体对象。 实体框架 支持针对概念模型的对象查询。 可以使用 Entity SQL 、语言集成查询 (LINQ) 和对象查询生成器方法来编写查询。
在概念性模型中,实体通过关联来相互相关。 在对象层,这些关联由基于实体引用公开相关对象集合的属性来表示。 例如,在 School 模型中,Department.Course 基于 Course 和 Department 之间的关联来获取 Course 对象的实体集合。 如果 ObjectContext 类上的 LazyLoadingEnabled 属性设置为 false,则不会自动加载引用对象并且必须对实体引用调用 Load 方法将相关对象数据加载到对象上下文中。
注意: |
---|
如果使用实体数据模型设计器来生成对象层代码,则默认情况下,ObjectContext 类上的 LazyLoadingEnabled 属性设置为 true。 |
还可以指定查询路径,查询路径定义要与返回的对象一起加载哪些相关对象。 有关更多信息,请参见查询概念模型(实体框架)。
下面摘自快速入门的示例演示了一个查询,该查询在执行时将检索所有 Department 对象。 查询路径定义确保了与 Department 对象相关的 Course 对象也将同时返回。 Entity SQL ORDER BY 子句按 Name 对返回的对象进行排序。
' Define a query that returns all Department objects
' and related Course objects, ordered by name.
Dim departmentQuery As ObjectQuery(Of Department) = _
From d In schoolContext.Departments.Include("Courses") _
Order By d.Name _
Select d
// Define a query that returns all Department
// objects and course objects, ordered by name.
var departmentQuery = from d in schoolContext.Departments.Include("Courses")
orderby d.Name
select d;
有关更多信息,请参见查询概念模型(实体框架)。
可以定义一组使用存储过程对数据源执行查询的模型。 从这些存储过程得到的结果集将映射到概念性模型中的实体。 有关更多信息,请参见How to: Import a Stored Procedure。
使用对象
对象上下文中的对象是数据源中的数据的实体类型表示形式。 可以修改、创建和删除对象上下文中的对象。 对象上下文管理标识以及各对象之间的关系。 还可以序列化对象以及将对象绑定到控件。 有关更多信息,请参见使用对象(实体框架)。
下面的示例摘自快速入门,它获取与 Department 对象相关的 Course 对象的集合,并将该集合绑定到 DataGridView 控件。
' Get the object for the selected department.
Dim department As Department = _
CType(Me.departmentList.SelectedItem, Department)
' Bind the grid view to the collection of Course objects
' that are related to the selected Department object.
courseGridView.DataSource = department.Courses
//Get the object for the selected department.
Department department = (Department)this.departmentList.SelectedItem;
//Bind the grid view to the collection of Course objects
// that are related to the selected Department object.
courseGridView.DataSource = department.Courses;
Entity Framework 跟踪实体数据的更改,并使您能将更改持久保存回数据源。 在下面摘自快速入门的示例中,对象上下文中的更改将写入数据库。
' Save object changes to the database,
' display a message, and refresh the form.
schoolContext.SaveChanges()
有关更多信息,请参见创建、添加、修改和删除对象(实体框架)。
可以定义一个概念模型,该概念模型使用存储过程在数据源中插入、更新和删除数据。 这些存储过程将映射到概念性模型中的实体。 有关更多信息,请参见Walkthrough: Mapping an Entity to Stored Procedures。