Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Este passo a passo demonstra o uso de associações do LINQ to SQL para representar relações de chave estrangeira no banco de dados.
Observação
Seu computador pode mostrar nomes ou locais diferentes para alguns dos elementos de interface do usuário do Visual Studio nas instruções a seguir. A edição do Visual Studio que você tem e as configurações que você usa determinam esses elementos. Para obter mais informações, consulte Personalizando o IDE.
Este passo a passo foi escrito usando as Configurações de Desenvolvimento do Visual Basic.
Pré-requisitos
Você deve ter concluído o Passo a passo: modelo de objeto simples e consulta (Visual Basic). Este passo a passo se baseia nesse, incluindo a presença do arquivo northwnd.mdf em c:\linqtest.
Visão geral
Este passo a passo consiste em três tarefas principais:
Adicionando uma classe de entidade para representar a tabela Orders no banco de dados Northwind de exemplo.
Adicionando anotações à classe
Customer
para melhorar a relação entre as classesCustomer
eOrder
.Criando e executando uma consulta para testar o processo de obtenção de informações de
Order
usando a classeCustomer
.
Mapeando relações entre tabelas
Após a definição de Customer
classe, crie a definição de Order
classe de entidade que inclui o código a seguir, que indica que Orders.Customer
se relaciona como uma chave estrangeira a Customers.CustomerID
.
Para adicionar a classe de entidade Order
Digite ou cole o seguinte código após a
Customer
classe:<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
Anotando a classe de cliente
Nesta etapa, você anota a Customer
classe para indicar sua relação com a Order
classe. (Essa adição não é estritamente necessária, pois definir a relação em qualquer direção é suficiente para criar o link. Mas adicionar essa anotação permite que você navegue facilmente por objetos em qualquer direção.)
Para anotar a classe Cliente
Digite ou cole o seguinte código na
Customer
classe: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
Criando e executando uma consulta pela relação de Customer-Order
Agora você pode acessar Order
objetos diretamente dos Customer
objetos ou na ordem oposta. Você não precisa de uma junção explícita entre clientes e pedidos.
Para acessar objetos Order usando objetos Customer
Modifique o
Sub Main
método digitando ou colando o seguinte código no método:' 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)
Pressione F5 para depurar seu aplicativo.
Dois nomes aparecem na caixa de mensagem e a janela Console mostra o código SQL gerado.
Feche a caixa de mensagem para interromper a depuração.
Criando uma exibição fortemente tipada do seu banco de dados
É muito mais fácil começar com uma exibição fortemente tipada do seu banco de dados. Digitando fortemente o DataContext objeto, você não precisa de chamadas para GetTable. Você pode usar tabelas fortemente tipadas em todas as suas consultas ao usar o objeto fortemente tipado DataContext .
Nas etapas a seguir, você criará Customers
como uma tabela fortemente tipada que mapeia para a tabela Customers no banco de dados.
Para tornar o objeto DataContext fortemente tipado
Adicione o código a seguir acima da declaração de
Customer
classe.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
Modifique
Sub Main
para usar o DataContext fortemente tipado da seguinte maneira:' 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()
Pressione F5 para depurar seu aplicativo.
A saída da janela console é:
ID=WHITC
Pressione Enter na janela Console para fechar o aplicativo.
No menu Arquivo , clique em Salvar Tudo se desejar salvar este aplicativo.
Próximas etapas
O próximo passo a passo (Passo a passo: manipulando dados (Visual Basic)) demonstra como manipular dados. Esse passo a passo não requer que você salve os dois tutoriais passo a passo desta série que você já concluiu.