ASP .NET - Criando entidades LINQ to SQL no VB .NET (revisão)


Este tutorial irá mostrar como podemos ignorar o Designer do LINQ to SQL e escrever nós mesmos as classes que representam o nosso domínio, para dessa forma chegarmos a uma melhor compreensão do que está acontecendo 'por trás dos panos'. Então não vamos gerar o arquivo .dbml usando o assistente vamos seguir outro caminho.

Para este exemplo, iremos usar uma tabela do banco de dados SQL Server com três colunas : categoriaid, categorianome, categoriadescricao;

Para facilitar eu vou criar uma nova tabela chamada Categorias no banco de dados Northwind.mdf com a seguinte estrutura:

Assim vamos tratar com o banco de dados Northwind.mdf e a tabela Categorias que criamos.

Criando o Projeto no Visual Web Developer

Abra o Visual Web Developer 2010 Express e vamos criar um novo projeto do tipo ASP .NET WEB Application com o nome LINQtoSQL_Entidades;

A seguir vamos incluir duas referências no projeto para permitir o mapeamento com LINQ to SQL e poder acessar a string de conexão no arquivo web.config;

No menu Project clique em Add Reference e a seguir clique na guia .NET e selecione o componente

Repita o procedimento acima e inclua uma referência ao componente System.Configuration:

Agora vamos incluir uma classe no projeto onde iremos realizar o mapeamento OR/M a partir das tabelas do banco de dados gerando as respectivas classes via código:

A seguir vamos definir o seguinte código nesta classe:

Imports System
Imports System.Linq
Imports System.Data.Linq.Mapping

<Table(name:="Categorias")> _
Public Class Categoria
    Private _Id As Integer
    Private _nome As String
    Private _descricao As String

    <Column(IsPrimaryKey:=True, IsDbGenerated:=True)> _
    Public Property CategoriaId() As Integer
        Get
            Return _Id
        End Get

        Set(ByVal value As Integer)
            _Id = value
        End Set
    End Property

    <Column(CanBeNull:=True)> _
    Public Property CategoriaNome() As String
        Get
            Return _nome
        End Get

        Set(ByVal value As String)
            _nome = value
        End Set
    End Property

    <Column(CanBeNull:=True)> _
    Public Property CategoriaDescricao() As String
        Get
            Return _descricao
        End Get

        Set(ByVal value As String)
            _descricao = value
        End Set
    End Property
End Class
Nesta etapa vamos criar a classe de entidade para a tabela Categoria que deve representar
a tabela Categorias em uma classe .NET; é desta forma que o LINQ To SQL efetua a modelagem
com ajuda de certos atributos.

O atributo <Table> possui a propriedade Name que podemos usar para especificar o nome exato
da tabela do banco de dados. Se a propriedade Name não for informada o LINQ To SQL  irá assumir
que a tabela do banco de dados possui o mesmo nome da classe.

No nosso exemplo a classe Categoria consiste de 3 propriedades publicas : categoriaid,categorianome
e categoriadescricao
. O que torna esta classe especial são os atributos <Table> e <Column>.

O atributo <Table> na classe Categoria indica que a classe representa uma tabela de um SGBD.

A propriedade Name do atributo <Table> especifica o nome da tabela no banco de dados. Se a classe e
tabela tiverem o mesmo nome você não precisa definir a propriedade Name.

Somente as instâncias das classes declaradas como tabelas serão armazenadas no banco de dados.
Instâncias desses tipos de classes são conhecidas como
entidades e as classes como classes de entidades.

Para associar a classe com a tabela precisamos definir cada campo ou propriedade que desejamos associar
com a coluna do banco de dados e para isso usamos o atributo Column.

A atributo <Column> especifica que a propriedade relacionada é uma coluna de uma tabela. Este atributo
possui diversas propriedades, a seguir temos as mais importantes:

  • Name: O nome da coluna da tabela;
  • DbType: O tipo de dados da coluna da tabela;
  • IsPrimaryKey:  Indica se a coluna representa a chave primária da tabela;
  • IsDbGenerated: Indica se os valores da coluna serão gerados pelo SGBD automaticamente.
    (Ex: colunas do tipo identity)
  • CanBeNull: Indica se uma coluna pode receber o valor null;
  • Storage: O nome do campo na classe que armazena os dados da coluna;

No nosso exemplo categoriaid é marcada com a propriedades IsPrimaryKey indicando que representa
uma chave primária. 

Vamos agora definir a string de conexão usada para acessar o banco de dados Northwind.mdf no arquivo web.Config conforme abaixo:

  <connectionStrings>
    <add name ="ConexaoNorthwind"
         connectionString ="Data Source=.\SQLEXPRESS;AttachDbFilename=C:\dados\NORTHWND.MDF;Integrated Security=True;Connect Timeout=30;User Instance=True"
                 providerName="System.Data.SqlClient" />    
  </connectionStrings>

Agora vamos abrir a página Default.aspx e incluir nela os componentes:

<%@ Page Title="Home Page" Language="vb" MasterPageFile="~/Site.Master" AutoEventWireup="false"
    CodeBehind="Default.aspx.vb" Inherits="LINQtoSQL_Entidades._Default" %>

<asp:Content ID="HeaderContent" runat="server" ContentPlaceHolderID="HeadContent">
</asp:Content>
<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">
    <h2>
        <asp:GridView ID="gdvDados" runat="server" Height="265px" Width="622px"> </asp:GridView>
        <asp:Button ID="btnProcurar" runat="server" Text="Procurar" Width="172px" />
        <asp:TextBox ID="txtNome" runat="server" BackColor="#FFFFE6" Width="457px"></asp:TextBox>
    </h2>
</asp:Content>
 
 

Finalmente vamos definir o código no arquivo code-behind Default.aspx.vb para tratar o evento Click do botão Procurar:

Imports System.Web.Configuration
Imports System.Data.Linq

Public Class _Default
    Inherits System.Web.UI.Page
    Protected Sub btnProcurar_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnProcurar.Click

        Dim con As String = WebConfigurationManager.ConnectionStrings("ConexaoNorthwind").ConnectionString
        Dim db As New DataContext(con)
        Dim categoria = db.GetTable(Of Categoria)()

        gdvDados.DataSource = categoria.Where(Function(p) p.CategoriaNome.Contains(txtNome.Text))
        gdvDados.DataBind()
    End Sub
End Class

Executando o projeto teremos a página Default.aspx exibida e, informando um valor para a busca, teremos o resultado exibido no controle GridView:

E assim vimos que podemos não depender do assistente gerando nós mesmos as classes que representam o  nosso domínio. Isso pode ser de grande ajuda em certos projetos.

Pegue o projeto completo aqui : LINQtoSQL_Entidades.zip

1Pe 1:3 Bendito seja o Deus e Pai de nosso Senhor Jesus Cristo, que, segundo a sua grande misericórdia, nos regenerou para uma viva esperança, pela ressurreição de Jesus Cristo dentre os mortos,
1Pe 1:4
para uma herança incorruptível, incontaminável e imarcescível, reservada nos céus para vós,

1Pe 1:5
que pelo poder de Deus sois guardados, mediante a fé, para a salvação que está preparada para se revelar no último tempo;

Referências:


José Carlos Macoratti