.NET

15 jul, 2009

Desvendando o Entity Framework – O Entity Data Model (EDM)

Publicidade

Muito tem se falado ultimamente em
ferramentas de mapeamento objeto relacional (OR/M) para
tratar o já conhecido problema da impedância entre o paradigma
da programação orientada a objetos (POO) e os
bancos de dados relacionais.

Os Bancos de dados relacionais usam
a abstração de linhas em tabelas, mas as aplicações
orientadas a objetos usam a abstração de classes e objetos, o
que não é a mesma coisa. As ferramentas para mapeamento objeto
Relacional (OR/M) tendem a contornar esta
diferença mapeando as classes para as tabelas do banco de dados,
mas mesmo assim existem algumas características que continuam a
exigir um esforço extra após todo esta trabalho.

O objetivo da ADO .NET
Entity Framework
é mais ambicioso; o serviço OR/M
seria apenas mais um serviço e outros serviços como
relatórios, sincronização, backup, etc. também seriam
oferecidos; para cobrir todos estes serviços foi criado um
modelo de dados que é similar ao usado no paradigma orientado a
objetos que o desenvolvedor utiliza, e também é independente de
qualquer linguagem ou plataforma.

Este modelo de dados é conhecido
como Entity Data Model (EDM) ou modelo de
entidades de dados e pode ser considerado o coração da
Entity Framework.

O
EDM é um modelo entidades –
relacionamentos onde:

  • Entidades
    – são instâncias de tipos de entidades como
    Clientes, Produtos os quais estão estruturados
    em registros e chaves;
  • Relacionamentos
    – são instâncias de tipos de relacionamentos
    que são associações entre dois ou mais tipos
    de entidades;

É a partir do modelo de entidades
que podemos escrever código usando as diferentes APIs, como o
provedor EntityClient ou o Object
Services
com LINQ to Entities.

Para melhor compreendermos os
conceitos relacionados com a EDM, podemos separá-los em dois
conjuntos:

  • Conceitos para
    definição de tipos ou estruturas;
  • Conceitos para
    gerenciamento de instâncias destes tipos;

Vejamos os conceitos básicos
relacionados com cada conjunto:

Tipos (principais):

  • EntityType
    Define os objetos de dados principais sobre os quais a
    informação deve ser gerenciada. Uma Entidade é uma
    instância de um EntityType e possui uma identidade
    única de existência independente e forma a unidade;
  • Property: Um EntityType
    pode ter uma ou mais propriedades de especificação SimpleType,
    ComplexType ou RowType;
  • EntityKey:
    Todas as instâncias de um EntityType
    são unicamente identificadas pelo valor de suas
    propriedades de identificação; o conjunto de
    propriedades de identificação é chamado de EntityKey;
  • Schema: Todos
    os tipos EDM estão contidos dentro de algum namespace. O
    conceito de schema define o namespace que descreve o
    escopo dos tipos EDM.

Instâncias (principais):

  • EntitySet: Um
    EntitySet para um EntityType trata instâncias
    do seu EntityType para qualquer um dos seus
    sub-tipos.
  • EntityContainter: Todos os conceitos baseados em instâncias EDM, como EntitySets e RelationshipSets, são definidos no
    escopo de um EntityContainer.

O EF possui o provedor de dados EntityClient,
namespace System.Data.EntityClient, que possui um modelo semelhante aos objetos
ADO .NET e usa os seguintes objetos: EntityCommandDefinition, EntityConnection, EntityConnectionStringBuilder, EntityDataReader, EntityParameter, EntityParameterCollection, EntityProviderFactory e EntityTransaction

Os comandos para este provedor
usando o Entity SQL, que opera nas entidades
definidas no modelo de entidades e nos objetos do Object
Services,
e é parecido com o T-SQL. Você pode usar os
Serviços de Objetos (Object Services)
para interagir
com o EDM usando o EntitySQL ou o LINQ
to Entities
.

Abaixo temos uma figura onde vemos
os Object Services na composição do Entity
Framework:

O Entity Data Model é um conceito, e
o Entity Framework possui uma implementação particular deste
modelo que é percebida como um arquivo EDMX em tempo de desenvolvimento.
Em tempo de execução, o arquivo EDMX é
tratado em três arquivos XML separados cada um com um papel
definido:

  • .CSDL(Conceptual Schema
    Definition Language)

    – (camada conceitual) responsável pelo modelo
    conceitual;
  • .MLS (Mapping Specification
    Language)
    – (camada
    de mapeamento) responsável pelo mapeamento;
  • .SSDL(Store Schema Definition
    Language
    ) – (camada
    de armazenamento) responsável pela persistência;

Abaixo temos uma figura que mostra
cada um destes arquivos que representam o arquivo .edmx:

Se você estiver curioso pode dar
uma olhada nos arquivos de schema que definem as regras para as
sessões CSDL, SSDL, e MSL no modelo. Os arquivos de schema para o
Visual Studio 2008 estão localizados em C:\Arquivos
de Programas\Microsoft
Visual Studio 9.0\Xml\Schemas

  • System.Data.Resources.CSDLSchema.xsd
  • System.Data.Resources.CSMSL.xsd
  • System.Data.Resources.SSDLSchema.xsd

Quando geramos um modelo de
entidades pela ferramenta visual do Visual Studio, vemos uma
representação gráfica de um Entity Data Model e de seus
membros na janela Entity Designer. Abaixo temos um exemplo de um
modelo de entidades gerado pela ferramenta visual do Visual
Studio 2008:

O descritor exibe o arquivo
Escola.edmx
gerado que consiste de duas entidades: Cursos
e Alunos
que foram geradas a partir das tabelas Alunos e
Cursos.

O descritor também exibe uma linha
conectando Cursos e Contatos que representa um
relacionamento um-para-muitos entre as duas
entidades. Cada entidade possui um número de propriedades
escalares e as entidades com relacionamentos, possui também as
propriedades de Navegação (Navigation Properties).

Onde as propriedades escalares são
propriedades cujos valores estão literalmente contidos na
entidade.

As propriedades de navegação são
ponteiros para as entidades relacionadas, dessa forma temos:

  • A entidade Cursos
    possui a propriedade de navegação Alunos que
    permite que a aplicação navegue a partir de um curso
    para qualquer aluno relacionado com o curso;
  • A entidade Alunos
    possui a propriedade de navegação Cursos que
    permite navegar a partir de um aluno para um único curso
    associado com o aluno;

A janela visual do
descritor da entidade usa uma notação para descrever os
relacionamentos entre as entidades conforme as opções a seguir:

– 1 (Um), *
(Muitos), 0..1 (Zero ou Um)
, 0…1:*
(Zero ou Um para Muitos)

Exemplo: “1:*”
significa “Um-para-Muitos.”
   enquanto    
“0..1:*”
significa ‘Zero ou
Um’ para Muitos”

Você notou que não existe chave
estrangeira representada no modelo?

Como então seria possível vincular
as entidades em um relacionamento?

A figura abaixo exibe as tabelas
Cursos
e Alunos
e o seu relacionamento. Observe que a tabela
Alunos
possui o campo CursoID que é usado para vincular as
tabelas.

O EDM
substitui esta chave estrangeira pela propriedade de navegação (Navigation
Properties),
permitindo assim a vinculação entre as entidades. (Na verdade no metadados do
modelo, o cursoID ainda existe
.)

Além disso o
descritor de entidades permite que você obtenha mais
informações sobre cada entidade e cada uma de suas
propriedades.

Assim, se selecionarmos uma
propriedade de uma entidade, veremos na janela de propriedades os detalhes como
na figura acima, onde vemos as propriedades da propriedade
produtoid da entidade Produtos.

Propriedades das entidades

Cada entidade e cada associação de
um EDM, bem como o próprio modelo, possui propriedades. Vamos alterar algumas
propriedades da entidade Produtos do modelo MacorattiModel.
Primeiro vamos selecionar a entidade para ver as suas propriedades na janela de
propriedades:

Na janela de propriedades
(figura acima) podemos ver que a entidade possui o nome Produtos tomado
diretamente da tabela no banco de dados.

Observe também que ela possui uma propriedade chamada Entity Set Name.

Um Entity Set é um container para uma
coleção de entidades de um tipo único. Por isso, a entity set chamada
Produtos contém uma coleção de entidades Produtos.

Os nomes foram gerados pelo assistente e ele
não tem a habilidade de automaticamente colocar os nomes no plural ou
singular quando for mais apropriado. No nosso caso, como ele tomou o nome
das tabelas que já estão no plural, não será necessário fazer ajustes.

Poderíamos alterar o nome das
propriedades para o modelo fazer mais sentido quando for o caso.

As propriedades de navegação (Proprieties
Navigation) também possuem o nome adotado das suas entidades associadas. A
entidade Produtos possui duas propriedades de navegação para representar
a associação para com as entidades Categorias e ItensPedidos.

Nesta pequena introdução abordei os
conceitos principais do Entity Data Model do Entity
Framework.

Aguarde mais artigos da série:
Desvendando o
EntityFramework.

Eu sei, é apenas Entity Framework, mas eu
gosto…