级别: 初级 Rajan Kumar, 软件开发人员, IBM Brent Gross, 软件工程师, IBM
2009 年 5 月 07 日 IBM Data Server Provider for .NET 使应用程序开发人员能够利用 Microsoft® Entity Framework 和 LINQ。您可以使用 IBM 数据服务器(DB2®、Informix® Dynamic Server 或 U2)、Microsoft ADO.NET Entity Framework 和 LINQ 轻松开发数据访问 .NET 应用程序。本文将展示如何结合使用 Entity Framework 和一种 IBM 数据服务器,逐步引导您创建自己的应用程序。
引言
IBM Data Server Provider for .NET 支持在 IBM 数据服务器(DB2、IDS 和 U2)中使用 Microsoft Entity Framework。您可以生成实体数据模型(Entity Data Model,EDM)架构,可以使用支持的 IBM 数据服务器版本向实体应用程序编写和执行 EntitySQL 和 LINQ 语句。它支持开发人员使用概念模型查询和操作数据,而无需使用物理存储模型。
本文将展示如何使用 IBM 数据服务器数据库来利用 LINQ 和 Entity
Framework。您将按照一个分步流程来开发一个简单 Windows® 应用程序,从 IBM 数据服务器数据库架构生成一个 EDM 模型,创建访问数据的 LINQ 查询,将查询结果绑定到控件,更新对象,以及将更改持久化到数据库。
IBM Data Server Provider for .NET 还具有其他许多丰富的功能,包括:
- 映射详细信息 CSDL/SSDL/MSL
- 实体 SQL 和查询生成器
- 懒惰(延迟)和预先加载
- 对象服务和变更跟踪
- 使用存储过程和 U2 子例程导入 EDM 函数
- 规范函数
- 乐观并发性
- ADO.NET 数据服务(RESTful)
- SilverLight 和 AJAX 开发
- ASP.NET 动态数据
- 使用 EDM 进行 Visual Studio Tools for Office (VSTO) 开发
在未来的文章中将讨论这些功能中的许多功能。
重点讨论启用了 IBM Entity
Framework 的 ADO.NET Provider
IBM Data Server Provider for .NET 支持以下 IBM 数据服务器:
- DB2 for Linux®, UNIX®, and Windows,9.1 版(或更高版本)
- DB2 for IBM i5/OS® V5R3
- DB2 for IBM i 5.4
- DB2 for z/OS® V7、V8 和 V9
- IBM Informix Dynamic Server,11.10 版(或更高版本)
- UniVerse 10.2(或更高版本)和 UniData® 7.1(或更高版本)
IBM Data Server Provider for .NET 支持使用 Visual Studio 2008 的以下 ADO.NET 实体数据模型(参见 参考资料 了解它们的限制):
- 表
- 视图
- 存储过程和 U2 子例程
- LINQ to Entities
- 实体 SQL 和实体提供者(Entity SQL and Entity Provider)
- 查询生成器(Query Builder)
- 对象服务(Object Services)
了解系统需求
您需要以下软件来完成本文中的示例:
- IBM Data Server Driver for ODBC, CLI, and .NET(9.5.3 版或更高版本)
- IBM Database Add-ins for Visual Studio(9.5.3 版或更高版本)
- Visual Studio 2008 Service Pack 1
- .NET Framework 3.5 Service Pack 1
您可以访问 参考资料 中的链接来下载这些产品。
安装
IBM Data Server Provider for .NET 是 IBM Data Server Driver
for ODBC, CLI, and .NET 的一个组件。可通过以下方法查看它的版本:
- 找到 \netf20 目录(比如
c:\Program Files\IBM\IBM DATA
SERVER DRIVER\bin\netf20)。
- 右键单击 IBM.Data.DB2.dll
- 单击 Properties。
图 1 显示了出现的屏幕。
图 1. 数据提供者
要查看 VS2008 SP1、.NET Framework 3.5 SP1 和 IBM Database Add-ins for
Visual Studio 的版本,执行以下操作:
- 打开 Visual Studio 2008。
- 转到 Help 菜单。
- 单击 About Microsoft Visual Studio。
图 2 显示了出现的屏幕。
图 2. IBM 数据库插件
测试您的连接
在学习下面的 LINQ 和 Entity 教程之前,请检查一下您的连接。IBM Client Installation 包含一个实用工具,名为 testconn20.exe。这个工具是随安装程序一起提供的,它通常位于 c:\Program Files\IBM\SQLLIB\BIN。要执行连接测试,打开命令提示符并使用表 1 中合适的命令运行该实用工具。
表 1. 测试连接
| IBM 数据服务器 | 命令 | 备注 |
|---|
| DB2 LUW | testconn20.exe
database=sample;server=localhost:50000;userid=user;password=**** |
| | DB2 iSeries® | testconn20.exe
database=sample;server=myhost.ibm.com:446;userid=user;password=**** |
| | DB2 zSeries® | testconn20.exe
database=sample;server=myhost.ibm.com:446;userid=user;password=**** |
| | IDS | testconn20.exe
database=stores_demo;server=localhost:1538;userid=user;password=**** |
| | U2 (UniVerse) | testconn20.exe
database=HS.SALES;server=localhost;userid=user;password=***;ServerType=universe;pooling=false | 指定 ServerType 和 Pooling | | U2 (UniData) | testconn20.exe
database=demo;server=localhost;userid=user;password=***;ServerType=unidata;pooling=false | 指定 ServerType 和 Pooling |
了解启用了 IBM Entity
Framework 的 ADO.NET Provider 架构
图 3 显示了 Entity Framework 的架构。
图 3. Entity Framework 的架构
为本文的示例选择一个数据库
可以为本文的示例选择以下数据库。
表 2. 数据库
| IBM 数据服务器 | 数据库名称 | 备注 |
|---|
| DB2 LUW | sample |
| | DB2 iSeries | sample | 使用任何数据库 | | DB2 zSeries | sample | 使用任何数据库 | | IDS | stores_demo |
| | U2 ( UniVerse) | ADONET | HS.SALES 已重命名为 ADONET | | U2 (UniData) | demo |
|
完成示例
本节逐步引导您结合使用 LINQ 和 Entity Framework 以及 IBM 数据服务器。从较高层面上,您将:
创建一个 Windows 表单应用程序
要使用 Visual Studio 创建 Windows 应用程序,执行以下步骤:
- 在 File 菜单上,单击 New Project。
- 在 Project Types 窗格中选择 Visual Basic 或 Visual C#。
- 在 Templates 窗格中选择 Windows Forms Application。
- 输入
Test_EF 作为项目名称。
- 单击 OK。
图 4 显示了出现的屏幕。
图 4. 新的 Windows 项目
要创建表单:
- 在 Test 项目中,选择默认表单(Form1)。
- 在 Toolbox 中,展开 Common Controls,将 ComboBox 控件拖到表单上,并将该控件的名称更改为 comboBox。
- 在 Toolbox 中,将 Button 控件拖到表单上,将该控件的名称更改为 closeForm,将 Text 值更改为 Close。
- 双击 closeForm 按钮控件。这将打开表单的代码页面,并且会创建 closeForm_Click 事件处理器方法。
- 在 closeForm_Click 事件处理器方法中,输入以下代码来关闭表单:
private void closeForm_Click(object sender, EventArgs e)
{
// Close the form.
Close();
}
|
图 5 显示了得到的表单设计。
图 5. 表单设计
生成一个实体数据模型 (EDM)
使用 Entity Data Model 向导从 IBM 数据服务器生成一个实体数据模型。
本文使用 IBM U2 UniVerse ADONET (HS.SALES) 示例数据库来进行演示。对于其他服务器,某些表和列将有所不同。但是,操作步骤是一样的。(注意 DB2 iSeries 服务器具有一个 APAR,它会影响 EDM Designer 的操作。参见 参考资料 了解更多信息。)
要添加 ADO.NET Entity Data Model 项模板,执行以下步骤:
- 在 Solution Explorer 中选择项目,右键单击 Add 并单击 New Item。
- 在 Templates 窗格中选择 ADO.NET Entity Data Model。
- 输入 Customer.edmx 作为模型名称,然后单击 Add。
图 6. 添加新项
将显示 Entity Data Model 向导的初始页面。
要生成 EDM:
- 在 Choose Model Contents 对话框中选择 Generate from database。
- 单击 Next。
图 7.
从数据库生成
- 单击 New Connection 按钮。
图 8. 新连接
- 在 Choose Data Source 对话框中选择 IBM DB2, IDS and U2
Servers (IBM DB2, IDS and U2 Data Provider for .NET Framework) 数据源。
- 单击 Continue。
- 在 Connection Properties 对话框中,输入您的用户名、密码、服务器名称和数据库名称。例如,对于 DB2 LUW,数据库为 sample,而对于 UniVerse,数据库为 ADONET。
- 单击 OK。
图 9. 添加连接
- 对于 U2(UniVerse 和 UniData),选择 Advanced 按钮,并指定 ServerType 和 Pooling。Choose Your Data Connections 对话框使用您的数据库连接设置进行更新。
- 确保选中了 Save entity connection settings in App.Config as,将其值设置为 ADONETEntities,如图 10 所示。
图 10. 保存连接字符串
- 单击 Next。图 11 显示了出现的 Choose Your Database Objects 对话框。
图 11.
Choose Your Database Objects
- 确保选择了所有表和存储过程,并且 Model 名称空间的值为 ADONETModel。
- 单击 Finish 完成向导。
向导执行以下操作:
- 添加对 System.Data.Entity、System.Runtime.Serialization 和 System.Security 程序集的引用
- 生成定义 EDM 的 Customer.edmx 文件
- 创建一个源代码文件,其中包含根据 EDM 生成的类。可以在 Solution Explorer 中展开 .edmx 文件来查看源代码文件。
- 创建一个 App.Config 文件
要在 ADO.NET Entity Data Model Designer 中查看 EDM,打开 Solution Explorer 并双击 Customer.edmx 文件。这将在 ADO.NET Entity Data Model Designer 窗口显示 EDM 模型。如图 12 所示。
图 12. 生成的 EDM
注意,对于 U2 数据服务器,有一个限制会阻止 EDM Designer 自动发现关联。参见 附录 获取解决办法。
查询实体、关联和与控件的数据绑定
要查询数据库:
- 在表单的代码文件的开头,使用(C#)语句添加以下代码,以引用从数据库和实体名称空间创建的模型:
C#
using System.Data.Objects;
using System.Data.Objects.DataClasses;
|
- 在表单的 partial 类定义顶部,添加以下代码:
C#
ADONETEntities m_context ;
|
- 在表单设计器中,双击表单。这将打开表单的代码页面,并创建 Form1_Load 事件处理器方法。
- 在 Form1_Load 事件处理器方法中,复制并粘贴以下代码。或者,您可以输入代码并使用 IntelliSense 来完成代码。
C#
private void Form1_Load(object sender, EventArgs e)
{
m_context = new ADONETEntities();
var query = from c in m_context.CUSTOMER
select c;
try
{
this.comboBox.DisplayMember = "FNAME";
this.comboBox.DataSource = query;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
|
要显示选定项的结果,执行以下步骤:
- 在表单设计器中,双击 comboBox 控件。这将创建 comboBox _SelectedIndexChanged 事件处理器方法。
- 输入以下代码。或者您可以输入代码并使用 IntelliSense 来完成代码。
C#
private void comboBox_SelectedIndexChanged(object sender, EventArgs e)
{
try
{
// lazy loading
CUSTOMER lCust = (CUSTOMER)this.comboBox.SelectedItem;
var query = from o in m_context.CUSTOMER_ORDERS
where o.CUSTID == lCust.CUSTID
select o;
dataGridView.DataSource = query;
dataGridView.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
|
插入和更新数据
要保存对对象的更改,执行以下步骤:
- 在 Toolbox 中,展开 Common Controls,将 Button 控件拖到表单设计器上,将该控件的名称更改为 saveChanges,将 Text 值更改为 Update。
- 在表单设计器中,双击 saveChanges 控件。这将创建 saveChanges_Click 事件处理器方法。
- 输入以下代码,将对象更改保存到数据库。
C#
private void saveChanges_Click(object sender, EventArgs e)
{
try
{
// Save object changes to the database, display a message,
// and refresh the form.
m_context.SaveChanges();
MessageBox.Show("Changes saved to the database.");
this.Refresh();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
|
要通过在 closeForm_Click 事件处理器方法中清理长期运行的对象上下文来关闭连接,输入以下代码。
C#
private void closeForm_Click(object sender, EventArgs e)
{
// Dispose the object context.
m_context.Dispose();
// Close the form.
Close();
}
|
这段代码在关闭表单之前清理对象上下文。
要编译并运行应用程序,执行以下步骤:
- 从 Debug 菜单选择 Start Debugging 或 Start Without
Debugging。这将编译并启动应用程序。
- 当表单加载时,从 ComboBox 控件选择一个主数据。这将显示属于该主数据的细节数据。
- 在 DataGridView 中,更新任意信息,或者添加一个新项,然后单击 Update。这会将更改保存到数据库,并显示一个消息框,说明保存的更改的数量,如图 13 所示。
图 13. 运行应用程序
结束语
本文很好地概述了如何在 IBM 数据服务器(DB2、IDS 和 U2)中使用 LINQ 和 Entity Framework,演示了实体数据模型的概念,并展示了 Entity Framework 提供的各种查询技术。本文还展示了如何使用 LINQ 和 Entity Framework 添加、修改和删除数据
附录
对于 U2 数据服务器,有一个限制会阻止 EDM Designer 自动发现关联。您可以采用以下办法来手动添加关联。
- 右键单击 EDM Designer。
- 单击 Add > Association。
图 14. 建立关联
- 选择 CUSTOMER 和 CUSTOMER_ORDERS。
图 15. 添加关联
图 16 和 17 比较了添加新关联之前和之后的屏幕。
图 16. 关联之前的模型
图 17. 关联之后的模型
- 在 U2 数据服务器上,在 XML 编辑器中打开 Customer.edmx 文件,并修改 @ASSOC_ROW。例如,您可以将
"@ASSOC_ROW" 更改为 ""@ASSOC_ROW""。
参考资料 学习
获得产品和技术
讨论
作者简介  | 
|  | Rajan 是位于科罗拉多州丹佛的 IBM U2 Data Management Software Group 的一名开发人员。它主要研究 UniVerse 和 UniData 的 .NET、Windows 和 Java 数据访问工具。他目前正在参与 IBM data server provider for .NET 和 IBM Database Add-ins for Visual Studio 项目。 |
 | 
|  | Brent Gross 是多伦多实验室的 IBM Information Management
Development 的一名资深软件工程师。他拥有超过 20 年与 IBM 合作的丰富经验,他从 1995 年就开始进行 DB2 开发。他的研究领域包括存储过程支持和客户端界面的架构和开发。Brent 经常出席许多 DB2 和用户组会议,他目前是 .NET and OLE DB APIs for DB2 and DB2 Connect 的架构师。 |
对本文的评价
|