Entity Framework简介
为初学者快速入门 Entity Framework 的简单介绍。文章解释了模型和查询语言。
引言
Entity Framework 是一个对象关系映射框架。它允许开发人员直接处理领域特定的对象。它使开发人员能够自由编写特定于存储的数据访问代码。特定于存储的模式可以更改,而无需更改应用程序代码。丰富的查询语言支持允许开发人员针对概念模型编写复杂的查询。
本文面向希望开始使用 Entity Framework 的初学者。本文使用 Entity Framework 版本 5 和 Visual Studio 2010。我使用 Northwind 数据库,但为了本文的代码示例,我简化了数据库模式。
创建概念模型
在 Entity Framework 中,开发人员专注于领域特定的对象并直接处理它们。要开始,您需要一个概念模型。您可以使用 Visual Studio 中的 EF 设计器为新数据库或现有数据库构建模型。有一些文章讨论了 code-first 方法或 database-first 方法。您可以使用 model first 来实现这一点,我推荐这种方法。
为新数据库创建概念模型
1. 创建一个新的类库项目。2. 点击“工具”->“库包管理器”->“管理解决方案的 NuGet 包”。在左侧面板点击“联机”。搜索并安装 Entity Framework 版本 5。
3. 右键单击项目,然后单击“添加新项”。
4. 点击“Visual C#”->“数据”->“ADO.Net Entity Data Model”。将模型命名为 NorthwindModel.edmx。
5. 点击“空模型”。
6. 然后打开模型进行编辑。
图 1. 选择空模型
创建实体
1. 右键单击设计器,然后单击“添加实体”。2. 如图 2 所示,添加 Customer 实体。
3. 右键单击 Customer 实体,然后单击“添加其他标量属性”。
4. 如图 3 所示,从属性编辑器中更改属性名称和类型。
图 2. 添加客户实体
图 3. 更改客户属性
重复以上步骤添加 Order 实体。最终的图应该看起来像图 4。
图 4. 客户订单实体图
创建关联
1. 右键单击 Customer,然后单击“添加关联”。2. 将关联命名为 CustomerOrder,并勾选“添加外键属性”框。
图 5. 添加客户订单关联
添加关联后,图应该看起来如下。
图 6. 客户订单关联
生成数据库
右键单击设计器,然后单击“从模型生成数据库”。系统会创建一个名为 "NorthwindModel.edmx.sql" 的文件,可用于创建数据库。
图 7. 数据库脚本文件
为现有数据库创建概念模型
1. 选择“添加新项”,单击“ADO.Net Entity Data Model”,并将模型命名为 "NorthwindModel.edmx"。2. 单击“从数据库生成”,然后仅选择 Customer 和 Order 表。
图应该与第一种方法相同。
实体类
Entity Framework 从概念模型生成数据库上下文类和 POCO 实体类。POCO 实体的优点是类定义非常简单。
右键单击 EF 设计器,然后单击“添加代码生成项”。请选择 DBContext 模板。DBContext 是 Entity Framework 的简化 API。如图所示,会生成几个文件。
图 8. 框架生成的类文件
导航属性
实体之间的关联实现为导航属性。例如,在客户和订单的关系中,一个客户可以有多个订单。因此,它有一个 Orders 集合作为导航属性。Order 只有一个 Customer 作为导航属性。
复杂类型
复杂类型可用于组织实体中的标量属性。例如,客户地址可能有街道、城市和邮政编码属性,并且可以将它们组织到 Address 复杂类型中。右键单击设计器,然后单击“重构为新复杂类型”以添加复杂类型。
使用概念模型
Entity Framework 提供了强大的支持,可以针对概念模型编写复杂的查询。您可以使用 LINQ 或 SQL 查询模型。
LINQ to Entities
LINQ 用于针对 Entity Framework 概念模型编写查询并返回实体对象。以下查询获取第一个客户并显示联系人姓名和职务。
using (var context = new NorthwindEntities()) { // return first customer var cust = (from c in context.Customers select c).First(); Console.WriteLine(cust.ContactName); Console.WriteLine(cust.ContactTitle); }
SQL 查询
您可以编写 SQL 查询并返回实体对象。以下查询打印客户列表。
using (var context = new NorthwindEntities()) { string sql = @"SELECT * FROM dbo.Customer"; var query = context.Customers.SqlQuery(sql, new object[] { }); foreach (var cust in query) { Console.WriteLine(cust.ContactName); Console.WriteLine(cust.ContactTitle); } }
查询投影
查询通常返回实体对象,但它们也可能返回匿名投影或原始类型。
var query = from c in context.Customers select new { ClientName = c.ContactName }; foreach (var cl in query) { Console.WriteLine(cl.ClientName); }
加载相关对象
加载相关对象的两种主要方法是:
1. 延迟加载
2. 预加载
在延迟加载中,相关对象在通过导航属性访问时加载。在预加载中,将 include 方法包含在查询中。以下是使用延迟加载和预加载的示例。
延迟加载
var cust = (from c in context.Customers select c).First(); Console.WriteLine(cust.ContactName); foreach (var order in cust.Orders) { Console.WriteLine(order.OrderDate); }
预加载
var cust = (from c in context.Customers.Include("Orders") select c).First(); Console.WriteLine(cust.ContactName); foreach (var order in cust.Orders) { Console.WriteLine(order.OrderDate); }
导入存储过程
您可以导入存储过程来返回模型对象。右键单击 EF 设计器,然后单击“函数导入”,如图 9 所示。
图 9. 添加函数导入
以下代码使用导入的函数。
var cust = (from c in context.GetCustomer(1) select c).First(); Console.WriteLine(cust.ContactName);
带存储过程的模型
您可以指定存储过程来修改实体数据。这些存储过程将替换 Entity Framework 生成的方法。右键单击设计器,然后单击“存储过程映射”。将插入、删除和更新操作映射到存储过程,如图 10 所示。
图 10. 添加存储过程映射
本地数据
查询数据会被缓存并由上下文跟踪。数据可以标记为不同的状态,如已添加、已更新或已删除。通常数据更改会自动跟踪,但可以通过配置关闭并显式调用。以下代码显示了如何手动跟踪。
// Set auto detect off and call manually context.Configuration.AutoDetectChangesEnabled = false; DbChangeTracker tracker = context.ChangeTracker; // get a customer object Customer cust = context.Customers.First(); // add a order to it Order od = new Order(); od.CustomerID = 1; od.OrderDate = DateTime.Now; cust.Orders.Add(od); // the new change is not tracked int cnt = tracker.Entries().ToList().Count; Console.WriteLine(cnt); // call detect changes and changes are tracked by context context.ChangeTracker.DetectChanges(); cnt = tracker.Entries ().ToList().Count; Console.WriteLine(cnt);
总结
本文为您提供了 Entity Framework 的简单介绍,以便您可以开始工作并深入研究更多细节。
请投票和提出建议。希望您喜欢这篇文章。