65.9K
CodeProject 正在变化。 阅读更多。
Home

Entity Framework简介

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.43/5 (16投票s)

2012年11月27日

CPOL

5分钟阅读

viewsIcon

63767

为初学者快速入门 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. 然后打开模型进行编辑。

Choose empty model
图 1. 选择空模型

创建实体

1. 右键单击设计器,然后单击“添加实体”。
2. 如图 2 所示,添加 Customer 实体。
3. 右键单击 Customer 实体,然后单击“添加其他标量属性”。
4. 如图 3 所示,从属性编辑器中更改属性名称和类型。

Add customer entity
图 2. 添加客户实体

Change customer property
图 3. 更改客户属性

重复以上步骤添加 Order 实体。最终的图应该看起来像图 4。

Customer Order entity diagram
图 4. 客户订单实体图

创建关联

1. 右键单击 Customer,然后单击“添加关联”。
2. 将关联命名为 CustomerOrder,并勾选“添加外键属性”框。

Add Customer Order association
图 5. 添加客户订单关联

添加关联后,图应该看起来如下。

Customer Order association
图 6. 客户订单关联

生成数据库

右键单击设计器,然后单击“从模型生成数据库”。系统会创建一个名为 "NorthwindModel.edmx.sql" 的文件,可用于创建数据库。

Database script file
图 7. 数据库脚本文件

为现有数据库创建概念模型

1. 选择“添加新项”,单击“ADO.Net Entity Data Model”,并将模型命名为 "NorthwindModel.edmx"。
2. 单击“从数据库生成”,然后仅选择 Customer 和 Order 表。

图应该与第一种方法相同。

实体类

Entity Framework 从概念模型生成数据库上下文类和 POCO 实体类。POCO 实体的优点是类定义非常简单。

右键单击 EF 设计器,然后单击“添加代码生成项”。请选择 DBContext 模板。DBContext 是 Entity Framework 的简化 API。如图所示,会生成几个文件。

Code generation
图 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 所示。

Add Function Import
图 9. 添加函数导入

以下代码使用导入的函数。

var cust = (from c in context.GetCustomer(1)
            select c).First();
Console.WriteLine(cust.ContactName);

带存储过程的模型

您可以指定存储过程来修改实体数据。这些存储过程将替换 Entity Framework 生成的方法。右键单击设计器,然后单击“存储过程映射”。将插入、删除和更新操作映射到存储过程,如图 10 所示。

Add stored procedure mapping
图 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 的简单介绍,以便您可以开始工作并深入研究更多细节。

请投票和提出建议。希望您喜欢这篇文章。

© . All rights reserved.