注释
此类 DataSet 和相关类是 2000 年代初的旧版 .NET Framework 技术,使应用程序能够在应用与数据库断开连接时处理内存中的数据。 这些技术对于使用户能够修改数据并将更改保留回数据库的应用特别有用。 尽管数据集是经过证实的成功技术,但新 .NET 应用程序的建议方法是使用 Entity Framework Core。 Entity Framework 提供了一种更自然的方式来将表格数据用作对象模型,并且具有更简单的编程接口。
Visual Studio 中的 LINQ to SQL 工具提供了一个可视化设计图面,用于创建和编辑基于数据库中对象的 LINQ to SQL 类(实体类)。 通过使用 LINQ to SQL,可以使用 LINQ 技术访问 SQL 数据库。 有关详细信息,请参阅 LINQ(语言集成查询)。
默认情况下,执行更新的逻辑由 LINQ to SQL 运行时提供。 运行时基于表架构(列定义和主键信息)创建默认值Insert
Update
和Delete
语句。 如果不想使用默认行为,可以配置更新行为,并指定特定的存储过程来执行处理数据库中的数据所需的必要插入、更新和删除。 此外,当未生成默认行为时(例如,当实体类映射到视图时),您也可以执行此操作。 此外,当数据库需要通过存储过程进行表访问时,可以替代默认更新行为。 有关详细信息,请参阅 使用存储过程自定义操作。
注释
本演练要求可以使用 Northwind 数据库的“InsertCustomer”、“UpdateCustomer”和“DeleteCustomer”存储过程。
本演练提供了必须遵循的步骤来替代默认 LINQ to SQL 运行时行为,以便使用存储过程将数据保存回数据库。
在本演练中,你将了解如何执行以下任务:
创建新的 Windows 窗体应用程序,并向其中添加 LINQ to SQL 文件。
创建映射到 Northwind
Customers
表的实体类。创建引用 LINQ to SQL
Customer
类的对象数据源。创建一个包含< c0 />并将其绑定到< c1 />类的 Windows 窗体。
为表单实现保存功能。
通过将存储过程添加到 O/R 设计器来创建DataContext方法。
将
Customer
类配置为使用存储过程执行插入、更新和删除。
先决条件
本演练使用 SQL Server Express LocalDB 和 Northwind 示例数据库。
如果没有 SQL Server Express LocalDB,请从 SQL Server Express 下载页或通过 Visual Studio 安装程序安装它。 在 Visual Studio 安装程序中,可以将 SQL Server Express LocalDB 作为 数据存储和处理 工作负荷的一部分或作为单个组件安装。
按照以下步骤安装 Northwind 示例数据库:
在 Visual Studio 中,打开 SQL Server 对象资源管理器 窗口。 (SQL Server 对象资源管理器作为数据存储和处理负荷的一部分在Visual Studio 安装程序中安装。) 展开 SQL Server 节点。 右键单击 LocalDB 实例并选择“新建查询”。
此时会打开查询编辑器窗口。
将 Northwind Transact-SQL 脚本 复制到剪贴板。 此 T-SQL 脚本从头开始创建 Northwind 数据库,并使用数据填充该数据库。
将 T-SQL 脚本粘贴到查询编辑器中,然后选择 “执行” 按钮。
短时间后,查询将完成运行并创建 Northwind 数据库。
创建应用并添加 LINQ to SQL 类
由于你正在使用 LINQ to SQL 类并在 Windows 窗体上显示数据,因此请创建新的 Windows 窗体应用程序,并添加 LINQ to SQL 类文件。
注释
本文中的说明说明了 Visual Studio 中提供的交互式开发体验(IDE)的最新版本。 您的计算机可能会显示某些用户界面元素的不同名称或位置。 你可能使用的是不同版本的 Visual Studio 或不同的环境设置。 有关详细信息,请参阅个性化设置 IDE。
创建一个包含 LINQ to SQL 类的新 Windows 窗体应用程序项目
在 Visual Studio 的文件菜单中,依次选择新建>项目。
在左侧窗格中展开 Visual C# 或 Visual Basic ,然后选择 Windows 桌面。
在中间窗格中,选择 Windows 窗体应用 项目类型。
将项目命名为 UpdateingWithSProcsWalkthrough,然后选择 “确定”。
已创建 UpdateingWithSProcsWalkthrough 项目,并将其添加到 解决方案资源管理器。
在“项目”菜单上,单击 “添加新项”。
单击 LINQ to SQL 类模板,并在“名称”框中键入 Northwind.dbml。
单击 添加。
将一个空的 LINQ to SQL 类文件(Northwind.dbml)添加到项目中,O /R 设计器 随即打开。
创建 Customer 实体类和对象数据源
通过将表从 服务器资源管理器 或 数据库资源管理器 拖动到 O/R 设计器来创建映射到数据库表的 LINQ to SQL 类。 结果将生成映射到数据库中的表的 LINQ to SQL 实体类。 创建实体类后,它们可用作对象数据源,就像具有公共属性的其他类一样。
创建 Customer 实体类并为其配置数据源
在 服务器资源管理器 或 数据库资源管理器中,在 Northwind 示例数据库的 SQL Server 版本中找到 Customer 表。
将 “客户 ”节点从 服务器资源管理器 或 数据库资源管理器 拖到 *O/R 设计器 图面上。
将创建名为 Customer 的实体类。 它具有与 Customers 表中的列对应的属性。 实体类名为 Customer (而不是 Customers),因为它表示 Customers 表中的单个客户。
注释
此重命名行为称为 复数化。 可以在 “选项”对话框中打开或关闭它。 有关详细信息,请参阅 “如何:打开和关闭复数”(O/R 设计器)。
在生成菜单上,单击编译UpdatingwithSProcsWalkthrough以生成项目。
若要打开 “数据源 ”窗口,请在 “数据 ”菜单上单击“ 显示数据源”。
在 “数据源 ”窗口中,单击“ 添加新数据源”。
在“选择数据源类型”页上单击“对象”,然后选择“下一步”。
展开 UpdateingwithSProcsWalkthrough 节点,找到并选择 Customer 类。
注释
如果 Customer 类不可用,请取消向导,生成项目,然后再次运行向导。
单击 “完成 ”以创建数据源,并将 Customer 实体类添加到 “数据源 ”窗口。
创建 DataGridView 以显示 Windows 窗体上的客户数据
通过将 LINQ to SQL 数据源项从“数据源”窗口拖动到 Windows 窗体上来创建绑定到实体类的控件。
向实体类添加绑定控件
在设计视图中打开 Form1 。
在 “数据源 ”窗口中,将 “客户 ”节点拖到 Form1 上。
注释
若要显示“数据源”窗口,请单击“数据”菜单上的“显示数据源”。
在代码编辑器中打开 Form1 。
将下面的代码添加到该窗体中。这些代码对于该窗体是全局性的,位于任何特定方法之外,但位于
Form1
类内部:为
Form_Load
事件创建事件处理程序,并将以下代码添加到处理程序:
实现保存功能
默认情况下,“保存”按钮未启用,并且未实现保存功能。 此外,为对象数据源创建数据绑定控件时,不会自动添加代码以将更改的数据保存到数据库。 本部分介绍如何启用保存按钮并为 LINQ to SQL 对象实现保存功能。
实现保存功能
在设计视图中打开 Form1 。
选择 CustomerBindingNavigator 上的保存按钮(带有软盘图标的按钮)。
在 “属性” 窗口中,将 “已启用 ”属性设置为 True。
双击保存按钮以创建事件处理程序并切换到代码编辑器。
将以下代码添加到保存按钮事件处理程序中:
重写用于执行更新(插入、更新和删除)的默认行为
覆盖默认更新行为
在 O/R 设计器中打开 LINQ to SQL 文件。 (双击解决方案资源管理器中的 Northwind.dbml 文件。
在服务器资源管理器或数据库资源管理器中,展开 Northwind 数据库存储过程节点,找到 InsertCustomers、UpdateCustomers 和 DeleteCustomers 存储过程。
将所有三个存储过程拖到 O/R 设计器上。
存储过程被添加到方法窗格中,作为DataContext 方法。 有关详细信息,请参阅 DataContext 方法(O/R 设计器)。
在 O/R 设计器中选择 Customer 实体类。
在 “属性” 窗口中,选择 “插入 ”属性。
单击“使用运行时”旁边的省略号(...)打开“配置行为”对话框。
选择自定义。
在“自定义”列表中选择 InsertCustomers 方法。
单击“ 应用” 保存所选类和行为的配置。
注释
只要每次更改后单击“ 应用 ”,就可以继续为每个类/行为组合配置行为。 如果在单击“ 应用”之前更改了类或行为,将显示一个警告对话框,提供应用任何更改的机会。
在“行为”列表中选择“更新”。
选择自定义。
在“自定义”列表中选择 UpdateCustomers 方法。
检查 方法参数 和 类属性 的列表,并注意到表中某些列有两 个方法参数 和两个 类属性 。 这样可以更加轻松地跟踪更改和创建检查并发冲突的语句。
将 Original_CustomerID 方法参数映射到 CustomerID (Original) 类属性。
注释
默认情况下,当名称匹配时,方法参数将映射到类属性。 如果属性名称已更改,并且不再与表和实体类之间匹配,则可能必须选择要映射到的等效类属性(如果 O/R 设计器 无法确定正确的映射)。 此外,如果方法参数没有要映射到的有效类属性,则可以将“类属性”值设置为“无”。
单击“ 应用” 保存所选类和行为的配置。
在“行为”列表中选择“删除”。
选择自定义。
在“自定义”列表中选择 DeleteCustomers 方法。
将 Original_CustomerID 方法参数映射到 CustomerID (Original) 类属性。
单击 “确定” 。
注释
在本演练中,虽然以下事实并不会产生问题,但仍然需要注意:LINQ to SQL 会在插入和更新操作期间自动为标识(自动递增)列、rowguidcol(数据库生成的全局唯一标识符 (GUID))列以及时间戳列处理数据库生成的值。 在其他列类型中,由数据库生成的值会意外导致 null 值。 若要返回数据库生成的值,应手动设置为 IsDbGeneratedtrue
AutoSync 下列值之一: AutoSync.Always、 AutoSync.OnInsert 或 AutoSync.OnUpdate。
测试应用程序
再次运行应用程序,验证 UpdateCustomers 存储过程是否正确更新数据库中的客户记录。
按F5键。
修改网格中的记录以测试更新行为。
添加新记录以测试插入行为。
单击“保存”按钮将更改保存回数据库。
关闭此窗体。
按 F5 并验证更新后的记录和新插入的记录是否持久化。
删除在步骤 3 中创建的新记录以测试删除行为。
单击“保存”按钮以提交更改,并从数据库中删除已删除的记录。
关闭此窗体。
按 F5 并验证已删除的记录是否已从数据库中删除。
注释
如果应用程序使用 SQL Server Express Edition,则根据数据库文件的 “复制到输出目录” 属性的值,在步骤 10 中按 F5 时可能不会显示更改。
后续步骤
根据应用程序要求,在创建 LINQ to SQL 实体类后,可能需要执行几个步骤。 可以对该应用程序进行以下一些增强:
在更新期间实现并发检查。 有关详细信息,请参阅乐观并发:概述。
添加 LINQ 查询以筛选数据。 有关信息,请参阅 LINQ 查询简介(C#)。