本演练演示如何使用 LINQ to SQL 关联来表示数据库中的外键关系。
注释
计算机可能会在以下说明中显示某些 Visual Studio 用户界面元素的不同名称或位置。 你拥有的 Visual Studio 版本以及所使用的设置决定了这些元素。 有关更多信息,请参阅 自定义 IDE。
本演练是使用 Visual Basic 开发设置编写的。
先决条件
必须已完成演练:简单对象模型和查询 (Visual Basic)。 本次演练是在前一次演练的基础上进行的,其中包括 c:\linqtest 文件夹中存在的 northwnd.mdf 文件。
概述
本演练由三个主要任务组成:
添加实体类以表示示例 Northwind 数据库中的 Orders 表。
将批注补充到
Customer
类,以增强Customer
类和Order
类之间的关系。创建并运行查询以测试使用
Order
类获取Customer
信息的过程。
跨表映射关系
类 Customer
定义后,创建 Order
包含以下代码的实体类定义,该定义指示 Orders.Customer
与外键 Customers.CustomerID
相关。
添加 Order 实体类
在类后面
Customer
键入或粘贴以下代码:<Table(Name:="Orders")> _ Public Class Order Private _OrderID As Integer Private _CustomerID As String Private _Customers As EntityRef(Of Customer) Public Sub New() Me._Customers = New EntityRef(Of Customer)() End Sub <Column(Storage:="_OrderID", DbType:="Int NOT NULL IDENTITY", _ IsPrimaryKey:=True, IsDBGenerated:=True)> _ Public ReadOnly Property OrderID() As Integer Get Return Me._OrderID End Get End Property ' No need to specify a setter because IsDBGenerated is true. <Column(Storage:="_CustomerID", DbType:="NChar(5)")> _ Public Property CustomerID() As String Get Return Me._CustomerID End Get Set(ByVal value As String) Me._CustomerID = value End Set End Property <Association(Storage:="_Customers", ThisKey:="CustomerID")> _ Public Property Customers() As Customer Get Return Me._Customers.Entity End Get Set(ByVal value As Customer) Me._Customers.Entity = value End Set End Property End Class
对 Customer 类进行批注
在此步骤中,为类添加 Customer
批注以指示其与 Order
类的关系。 (这一添加并非严格必要,因为定义任一方向的关系足以创建链接。但添加此批注确实使你能够轻松地在任一方向导航对象。
对 Customer 类进行批注
将以下代码键入或粘贴到
Customer
类中:Private _Orders As EntitySet(Of Order) Public Sub New() Me._Orders = New EntitySet(Of Order)() End Sub <Association(Storage:="_Orders", OtherKey:="CustomerID")> _ Public Property Orders() As EntitySet(Of Order) Get Return Me._Orders End Get Set(ByVal value As EntitySet(Of Order)) Me._Orders.Assign(value) End Set End Property
在 Customer-Order 关系中创建和运行查询
现在可以直接从Order
对象访问对象,也可以按相反的顺序访问Customer
对象。 客户和订单之间不需要显式联接。
使用 Customer 对象访问 Order 对象
修改
Sub Main
方法,将下面的代码键入或粘贴到方法中:' Query for customers who have no orders. Dim custQuery = _ From cust In Customers _ Where Not cust.Orders.Any() _ Select cust Dim msg As String = "", title As String = _ "Customers With No Orders", response As MsgBoxResult, _ style As MsgBoxStyle = MsgBoxStyle.Information For Each custObj In custQuery msg &= String.Format(custObj.CustomerID & vbCrLf) Next response = MsgBox(msg, style, title)
按 F5 调试应用程序。
消息框中会显示两个名称,控制台窗口显示生成的 SQL 代码。
关闭消息框以停止调试。
创建数据库的强类型化视图
从数据库的强类型化视图着手要容易得多。 通过强键入 DataContext 对象,无需调用 GetTable。 使用强类型 DataContext 对象时,可以在所有查询中使用强类型表。
在以下步骤中,您将创建 Customers
作为映射到数据库中的 Customers 表的强类型化表。
对 DataContext 对象进行强类型化
在类声明上方
Customer
添加以下代码。Public Class Northwind Inherits DataContext ' Table(Of T) abstracts database details per ' table/data type. Public Customers As Table(Of Customer) Public Orders As Table(Of Order) Public Sub New(ByVal connection As String) MyBase.New(connection) End Sub End Class
将
Sub Main
修改为使用强类型化的 DataContext,如下所示:' Use a connection string. Dim db As New Northwind _ ("C:\linqtest\northwnd.mdf") ' Query for customers from Seattle. Dim custs = _ From cust In db.Customers _ Where cust.City = "Seattle" _ Select cust For Each custObj In custs Console.WriteLine("ID=" & custObj.CustomerID) Next ' Freeze the console window. Console.ReadLine()
按 F5 调试应用程序。
控制台窗口输出为:
ID=WHITC
在控制台窗口中按 Enter 关闭应用程序。
在“ 文件 ”菜单上,如果要保存此应用程序,请单击“ 全部 保存”。
后续步骤
下一个演练(演练:操控数据(Visual Basic))演示如何操控数据。 该演练不要求您保存本系列中已经完成的两个演练的结果。