Estrutura de entidade - Entity Framework

Estrutura de entidade
Autor (es) original (is) Microsoft
Desenvolvedor (s) .NET Foundation
lançamento inicial 11 de agosto de 2008 ; 13 anos atrás ( 11/08/2008 )
Versão estável
Entity Framework 6: v6.4.4
Entity Framework Core: v5.0.0 / Entity Framework 6: 22 de abril de 2020 ; 17 meses atrás Entity Framework Core: 24 de outubro de 2020 ; 11 meses atrás ( 2020-04-22 )
 ( 2020-10-24 )
Repositório github .com / dotnet / ef6
github .com / dotnet / efcore
Escrito em C #
Plataforma .NET Framework ,
.NET Core
Modelo Mapeamento objeto-relacional
Licença Licença Apache 2.0
Local na rede Internet msdn .microsoft .com / en-us / data / ef .aspx

Entity Framework ( EF ) é uma estrutura de mapeamento objeto-relacional (ORM) de código aberto para ADO.NET . Ele foi originalmente enviado como parte integrante do .NET Framework . A partir do Entity Framework versão 6, ele foi entregue separadamente do .NET Framework.

Visão geral

O Entity Framework é um conjunto de tecnologias em ADO.NET que oferece suporte ao desenvolvimento de aplicativos de software orientados a dados. Arquitetos e desenvolvedores de aplicativos orientados a dados normalmente lutam com a necessidade de atingir dois objetivos muito diferentes. Eles devem modelar as entidades, relacionamentos e lógica dos problemas de negócios que estão resolvendo e também devem trabalhar com os mecanismos de dados usados ​​para armazenar e recuperar os dados. Os dados podem abranger vários sistemas de armazenamento, cada um com seus próprios protocolos; mesmo os aplicativos que funcionam com um único sistema de armazenamento devem equilibrar os requisitos do sistema de armazenamento com os requisitos de gravação de código de aplicativo eficiente e sustentável. Esse problema é geralmente conhecido como " incompatibilidade de impedância relacional de objeto ".

Muitas ferramentas de mapeamento objeto-relacional (ORM) (também conhecidas como "gerenciadores objeto-relacional") foram desenvolvidas para permitir que os desenvolvedores trabalhem com dados na forma de objetos e propriedades específicos de domínio, como clientes e endereços de clientes, sem se preocupar com as tabelas e colunas do banco de dados subjacentes onde esses dados são armazenados. Com um ORM, os desenvolvedores podem trabalhar em um nível mais alto de abstração ao lidar com dados e podem criar e manter aplicativos orientados a dados com menos código do que os aplicativos tradicionais. Entity Framework é a solução ORM atualmente promovida para uso na pilha de desenvolvimento da Microsoft.

História

A primeira versão do Entity Framework (EFv1) foi incluída no .NET Framework 3.5 Service Pack 1 e no Visual Studio 2008 Service Pack 1, lançado em 11 de agosto de 2008 (13 anos atrás) . Esta versão foi amplamente criticada, atraindo até um 'voto de censura' assinado por pelo menos mil desenvolvedores.  ( 11/08/2008 )

A segunda versão do Entity Framework, denominada Entity Framework 4.0 (EFv4), foi lançada como parte do .NET 4.0 em 12 de abril de 2010 e abordou muitas das críticas feitas à versão 1.

Uma terceira versão do Entity Framework, versão 4.1, foi lançada em 12 de abril de 2011, com suporte para Code First.

Uma atualização da versão 4.1, chamada Entity Framework 4.1 Update 1, foi lançada em 25 de julho de 2011. Inclui correções de bugs e novos tipos suportados.

A versão 4.3.1 foi lançada em 29 de fevereiro de 2012. Houve algumas atualizações, como suporte para migração.

A versão 5.0.0 foi lançada em 11 de agosto de 2012 e é direcionada ao .NET framework 4.5. Além disso, esta versão está disponível para .Net framework 4, mas sem nenhuma vantagem de tempo de execução em relação à versão 4.

A versão 6.0 foi lançada em 17 de outubro de 2013 e agora é um projeto de código aberto licenciado sob a licença Apache v2. Como a ASP.NET MVC , seu código-fonte é hospedado no GitHub usando Git. Esta versão tem uma série de melhorias para suporte de código primeiro .

A Microsoft então decidiu modernizar, criar componentes e trazer a plataforma cruzada do .NET para Linux, OSX e outros lugares, o que significa que a próxima versão do Entity Framework seria uma reescrita completa. Em 27 de junho de 2016, ele foi lançado como Entity Framework Core 1.0, juntamente com ASP.NET Core 1.0 e .NET Core 1.0. Ele foi originalmente denominado Entity Framework 7, mas foi renomeado para destacar que era uma reescrita completa em vez de uma atualização incremental e não substitui o EF6.

O Entity Framework Core 1.0 é licenciado pela Apache License v2 e está sendo desenvolvido inteiramente ao ar livre no GitHub . Embora o Entity Framework Core 1.0 compartilhe algumas semelhanças conceituais com versões anteriores do Entity Framework, é uma base de código completamente nova projetada para ser mais eficiente, poderosa, flexível e extensível, será executado no Windows, Linux e OSX e oferecerá suporte a uma nova gama de armazenamentos de dados relacionais e NOSQL.

Entity Framework Core 2.0 foi lançado em 14 de agosto de 2017 (4 anos atrás) junto com Visual Studio 2017 15.3 e ASP.NET Core 2.0  ( 2016/08/14 )

Entity Framework Core 3.0 foi lançado em 23 de setembro de 2019 (2 anos atrás) junto com Visual Studio 2019 16.3 e ASP.NET Core 3.0,  ( 23/09/2019 )

Entity Framework Core 3.1 (EF Core 3.1) foi formalmente lançado para uso em produção em 3 de dezembro de 2019 (22 meses atrás) e será a versão com suporte de longo prazo preferencial até pelo menos 3 de dezembro de 2022.  ( 03/12/2019 )

O mais recente Entity Framework Core 5.0.2 (EF Core 5) foi lançado para uso em produção em 12 de janeiro de 2021 (9 meses atrás) .  ( 2021-01-12 )

Arquitetura

Pilha do ADO.NET Entity Framework.

A arquitetura do ADO.NET Entity Framework, de baixo para cima, consiste no seguinte:

  • Provedores específicos de fonte de dados , que abstraem as interfaces ADO.NET para se conectar ao banco de dados ao programar em relação ao esquema conceitual.
  • Provedor de mapas , um provedor específico de banco de dados que converte a árvore de comando Entity SQL em uma consulta no tipo SQL nativo do banco de dados. Inclui a ponte específica da loja , que é o componente responsável por converter a árvore de comando genérica em uma árvore de comando específica da loja.
  • Analisador EDM e mapeamento de visualização , que leva a especificação SDL do modelo de dados e como ela mapeia no modelo relacional subjacente e permite a programação em relação ao modelo conceitual. A partir do esquema relacional, ele cria visualizações dos dados correspondentes ao modelo conceitual. Ele agrega informações de várias tabelas para agregá-las em uma entidade e divide uma atualização de uma entidade em várias atualizações para qualquer tabela que tenha contribuído para essa entidade.
  • Consulte e atualize o pipeline , processa as consultas, filtra e atualiza as solicitações para convertê-las em árvores de comando canônicas que são então convertidas em consultas específicas da loja pelo provedor de mapas.
  • Serviços de metadados , que tratam de todos os metadados relacionados a entidades, relacionamentos e mapeamentos.
  • Transações , para integração com recursos transacionais da loja subjacente. Se o armazenamento subjacente não suporta transações, o suporte para ele precisa ser implementado nesta camada.
  • API da camada conceitual , o tempo de execução que expõe o modelo de programação para codificação em relação ao esquema conceitual. Ele segue o padrão ADO.NET de usar objetos Connection para se referir ao provedor de mapa, usar objetos Command para enviar a consulta e retornar EntityResultSets ou EntitySets contendo o resultado.
  • Componentes desconectados , que armazenam em cache localmente conjuntos de dados e conjuntos de entidades para usar o ADO.NET Entity Framework em um ambiente ocasionalmente conectado.
  • Banco de dados embutido : ADO.NET Entity Framework inclui um banco de dados embutido leve para cache do lado do cliente e consulta de dados relacionais.
  • Ferramentas de design , como Mapping Designer, também estão incluídas no ADO.NET Entity Framework, o que simplifica o trabalho de mapear um esquema conceitual para o esquema relacional e especificar quais propriedades de um tipo de entidade correspondem a qual tabela no banco de dados.
  • Camada de programação , que expõe o EDM como construções de programação que podem ser consumidas por linguagens de programação.
    • Os serviços de objeto geram código automaticamente para classes CLR que expõem as mesmas propriedades de uma entidade, permitindo assim a instanciação de entidades como objetos .NET.
    • Serviços da web , que expõem entidades como serviços da web.
  • Serviços de alto nível , como serviços de relatório que funcionam em entidades em vez de dados relacionais.

Modelo de Dados de Entidade

O Entity Data Model ( EDM ) especifica o modelo conceitual (CSDL) dos dados, usando uma técnica de modelagem que é chamada de Entity Data Model, uma versão estendida do modelo entidade-relacionamento . O modelo de dados descreve principalmente as Entidades e Associações das quais participam. O esquema EDM é expresso na Schema Definition Language (SDL), que é uma aplicação de XML (Extended markup language). Além disso, o mapeamento (MSL) dos elementos do esquema conceitual (CSDL) para o esquema de armazenamento (SSDL) também deve ser especificado. A especificação de mapeamento também é expressa em XML.

O Visual Studio também fornece o Entity Designer para a criação visual do EDM e a especificação de mapeamento. A saída da ferramenta é o arquivo XML (* .edmx) especificando o esquema e o mapeamento. O arquivo Edmx contém artefatos de metadados EF (conteúdo CSDL / MSL / SSDL). Esses três arquivos (csdl, msl, ssdl) também podem ser criados ou editados manualmente.

Mapeamento

O Entity Data Model Wizard no Visual Studio inicialmente gera um mapeamento um-para-um (1: 1) entre o esquema do banco de dados e o esquema conceitual na maioria dos casos. No esquema relacional, os elementos são compostos pelas tabelas, com as chaves primária e estrangeira colando as tabelas relacionadas. Em contraste, os Tipos de Entidade definem o esquema conceitual dos dados.

Os tipos de entidade são uma agregação de vários campos digitados - cada campo é mapeado para uma determinada coluna no banco de dados - e pode conter informações de várias tabelas físicas. Os tipos de entidade podem estar relacionados entre si, independentemente dos relacionamentos no esquema físico. Entidades relacionadas também são expostas de forma semelhante - por meio de um campo cujo nome denota a relação da qual estão participando e acessando que, em vez de recuperar o valor de alguma coluna no banco de dados, atravessa o relacionamento e retorna a entidade (ou uma coleção de entidades) com com o qual está relacionado.

Tipos de entidade formam a classe de objetos com a qual as entidades estão em conformidade, com as entidades sendo instâncias dos tipos de entidade. Entidades representam objetos individuais que fazem parte do problema que está sendo resolvido pelo aplicativo e são indexados por uma chave. Por exemplo, convertendo o esquema físico descrito acima, teremos dois tipos de entidade:

  • CustomerEntity , que contém o nome do cliente da tabela Clientes e o endereço do cliente da tabela Contatos .
  • OrderEntity , que encapsula os pedidos de um determinado cliente, recuperando-os da tabela Pedidos .

O esquema lógico e seu mapeamento com o esquema físico são representados como um Entity Data Model (EDM), especificado como um arquivo XML. O ADO.NET Entity Framework usa o EDM para realmente executar o mapeamento, permitindo que o aplicativo trabalhe com as entidades, enquanto abstrai internamente o uso de construções ADO.NET como DataSet e RecordSet . O ADO.NET Entity Framework executa as junções necessárias para ter informações de referência de entidade de várias tabelas ou quando um relacionamento é atravessado. Quando uma entidade é atualizada, ela rastreia de qual tabela as informações vieram e emite instruções de atualização SQL para atualizar as tabelas nas quais alguns dados foram atualizados. ADO.NET Entity Framework usa eSQL, um derivado do SQL, para realizar consultas, operações teóricas de conjuntos e atualizações em entidades e seus relacionamentos. As consultas em eSQL, se necessário, são então traduzidas para o tipo de SQL nativo do banco de dados subjacente.

Tipos de entidades e conjuntos de entidades apenas formam o esquema EDM lógico e podem ser expostos como qualquer coisa. ADO.NET Entity Framework inclui Object Service que apresenta essas entidades como Objetos com os elementos e relacionamentos expostos como propriedades. Assim, os objetos Entity são apenas front-end para as instâncias dos tipos de entidade EDM, o que permite que linguagens Orientadas a Objetos acessem e utilizem-nas. Da mesma forma, outros front-ends podem ser criados, o que expõe as entidades por meio de serviços da web (por exemplo, WCF Data Services ) ou XML que é usado quando as entidades são serializadas para armazenamento de persistência ou transferência over-the-wire.

Entidades

Entidades ** são instâncias de EntityType s; eles representam as instâncias individuais dos objetos (como cliente , pedidos ) aos quais as informações pertencem. A identidade de uma entidade é definida pelo tipo de entidade da qual é uma instância; nesse sentido, um tipo de entidade define a classe à qual uma entidade pertence e também define quais propriedades uma entidade terá. As propriedades descrevem alguns aspectos da entidade, dando a ela um nome e um tipo. As propriedades de um tipo de entidade no ADO.NET Entity Framework são totalmente digitadas e são totalmente compatíveis com o sistema de tipos usado em um sistema DBMS, bem como com o Common Type System do .NET Framework. Uma propriedade pode ser SimpleType ou ComplexType e também pode ter vários valores. Todos os EntityType s pertencem a algum namespace e têm uma propriedade EntityKey que identifica exclusivamente cada instância do tipo de entidade. Os diferentes tipos de propriedade são distinguidos da seguinte forma:

  • SimpleType , corresponde a tipos de dados primitivos, como números inteiros , caracteres e pontos flutuantes .
  • ComplexType é um agregado de várias propriedades do tipo SimpleType ou ComplexType . Ao contrário dos EntityType s, no entanto, ComplexTypes não pode ter um EntityKey . No Entity Framework v1, os ComplexTypes não podem ser herdados.

Todas as instâncias de entidade são hospedadas em EntityContainers, que são contêineres por projeto para entidades. Cada projeto tem um ou mais EntityContainers nomeados, que podem fazer referência a entidades em vários namespaces e tipos de entidade. Várias instâncias de um tipo de entidade podem ser armazenadas em coleções chamadas EntitySets. Um tipo de entidade pode ter vários EntitySets.

Tipos primitivos de EDM (tipos simples):

Tipo EDM Mapeamento de tipo CLR
Edm.Binary Byte[]
Edm.Boolean boleano
Edm.Byte Byte
Edm.DateTime Data hora
Edm.DateTimeOffset DateTimeOffset
Edm.Decimal Decimal
Edm.Double Dobro
Edm.Guid Guid
Edm.Int16 Int16
Edm.Int32 Int32
Edm.Int64 Int64
Edm.SByte SByte
Edm.Single Solteiro
Edm.String Fragmento
Edm.Time Intervalo de tempo

Relacionamentos

Quaisquer dois tipos de entidade podem ser relacionados, por uma relação de associação ou uma relação de contenção . Por exemplo, uma remessa é cobrada de um cliente é uma associação, enquanto um pedido contém detalhes do pedido é uma relação de contenção. Uma relação de contenção também pode ser usada para modelar a herança entre entidades. A relação entre dois tipos de entidade é especificada por um tipo de relacionamento , instâncias do qual, chamadas relacionamentos , relacionam instâncias de entidade. Em versões futuras, outros tipos de relacionamento, como Composição ou Identificação , podem ser introduzidos.

Os tipos de relacionamento são caracterizados por seu grau (aridade) ou pelo número de tipos de entidades que eles se relacionam e por sua multiplicidade. No entanto, na versão inicial do ADO.NET Entity Framework, os relacionamentos são limitados a um relacionamento bidirecional binário (de grau dois). A multiplicidade define quantas instâncias de entidade podem ser relacionadas entre si. Com base na multiplicidade, os relacionamentos podem ser um para um, um para muitos ou muitos para muitos. Os relacionamentos entre entidades são nomeados; o nome é chamado de função. Ele define o propósito do relacionamento.

Um tipo de relacionamento também pode ter uma operação ou ação associada a ele, o que permite que alguma ação seja executada em uma entidade no caso de uma ação ser executada em uma entidade relacionada. Um relacionamento pode ser especificado para realizar uma Ação quando alguma Operação for realizada em uma entidade relacionada. Por exemplo, ao excluir uma entidade que faz parte de uma relação (a operação OnDelete ), as ações que podem ser tomadas são:

  • Cascade , que instrui a excluir a instância de relacionamento e todas as instâncias de entidade associadas.
  • Nenhum .

Para relacionamentos de associação, que podem ter semânticas diferentes em ambas as extremidades, diferentes ações podem ser especificadas para cada extremidade.

Linguagem de definição de esquema

ADO.NET Entity Framework usa uma linguagem de definição de dados baseada em XML chamada Schema Definition Language (SDL) para definir o esquema EDM. O SDL define os SimpleTypes semelhantes aos tipos primitivos CTS , incluindo String , Int32 , Double , Decimal , Guid e DateTime , entre outros. Uma Enumeração , que define um mapa de valores e nomes primitivos, também é considerada um tipo simples. Enumerações são suportadas apenas a partir do framework versão 5.0. ComplexTypes são criados a partir de uma agregação de outros tipos. Uma coleção de propriedades desses tipos define um Tipo de entidade. Esta definição pode ser escrita na gramática EBNF como:

  EntityType ::= 
    ENTITYTYPE entityTypeName [BASE entityTypeName]
      [ABSTRACT true|false] KEY propertyName [, propertyName]*
      {(propertyName PropertyType [PropertyFacet]*) +}

  PropertyType ::= (
        (PrimitiveType [PrimitiveTypeFacets]*)
        | (complexTypeName)
        | RowType
    
      PropertyFacet ::= (
        [NULLABLE true | false]
        | [DEFAULT defaultVal] 
        | [MULTIPLICITY [1|*]]
      )
    
      PropertyTypeFacet ::= 
        MAXLENGTH | PRECISION | SCALE 
        | UNICODE | FIXEDLENGTH | COLLATION
        | DATETIMEKIND | PRESERVESECONDS
    
      PrimitiveType ::= 
        BINARY | STRING | BOOLEAN
        | SINGLE | DOUBLE | DECIMAL | GUID
        | BYTE | SBYTE | INT16 | INT32 | INT64
        | DATETIME | DATETIMEOFFSET | TIME
  )

As facetas são usadas para descrever os metadados de uma propriedade, como se ela é anulável ou tem um valor padrão, bem como a cardinalidade da propriedade, ou seja, se a propriedade tem um valor único ou vários valores. Uma multiplicidade de “1” denota uma única propriedade de valor; um “*” significa que é uma propriedade com vários valores. Por exemplo, uma entidade pode ser denotada em SDL como:

<ComplexType Name="Addr">
    <Property Name="Street" Type="String" Nullable="false" />
    <Property Name="City" Type="String" Nullable="false" />
    <Property Name="Country" Type="String" Nullable="false" />
    <Property Name="PostalCode" Type="Int32" />
</ComplexType>
<EntityType Name="Customer">
    <Key>
        <PropertyRef Name="Email" />
    </Key>
    <Property Name="Name" Type="String" />
    <Property Name="Email" Type="String" Nullable="false" />
    <Property Name="Address" Type="Addr" />
</EntityType>

Um tipo de relacionamento é definido como especificando os pontos finais e suas multiplicidades. Por exemplo, uma relação um-para-muitos entre o cliente e os pedidos pode ser definida como

<Association Name="CustomerAndOrders">
    <End Type="Customer" Multiplicity="1" />
    <End Type="Orders" Multiplicity="*">
        <OnDelete Action="Cascade" />
    </End>
</Association>

Consultando dados

Entity SQL

ADO.NET Entity Framework usa uma variante da Structured Query Language , chamada Entity SQL , que visa escrever consultas declarativas e atualizações sobre entidades e relacionamentos de entidades - no nível conceitual. Ele difere do SQL por não ter construções explícitas para junções porque o EDM foi projetado para abstrair dados de particionamento em tabelas.

A consulta ao modelo conceitual é facilitada pelas classes EntityClient , que aceita uma consulta Entity SQL. O pipeline de consulta analisa a consulta Entity SQL em uma árvore de comando, segregando a consulta em várias tabelas, que é entregue ao provedor EntityClient. Como os provedores de dados ADO.NET, um provedor EntityClient também é inicializado usando um objeto Connection , que além dos parâmetros usuais de armazenamento de dados e informações de autenticação, requer o esquema SDL e as informações de mapeamento. O provedor EntityClient, por sua vez, transforma a árvore de comando Entity SQL em uma consulta SQL no tipo nativo do banco de dados. A execução da consulta retorna um Entity SQL ResultSet, que não é limitado a uma estrutura tabular, ao contrário de ADO.NET ResultSets.

O Entity SQL aprimora o SQL adicionando suporte intrínseco para:

  • Tipos , como entidades ADO.NET são totalmente tipadas.
  • EntitySets , que são tratados como coleções de entidades.
  • Composability , que remove as restrições sobre onde as subconsultas podem ser usadas.

Funções canônicas do Entity SQL

As funções canônicas são suportadas por todos os provedores de dados compatíveis com o Entity Framework. Eles podem ser usados ​​em uma consulta Entity SQL. Além disso, a maioria dos métodos de extensão em LINQ to Entities são convertidos em funções canônicas. Eles são independentes de qualquer banco de dados específico. Quando o provedor de dados ADO.NET recebe uma função, ele a traduz na instrução SQL desejada.

Mas nem todos os DBMSs têm funcionalidade equivalente e um conjunto de funções incorporadas padrão. Também existem diferenças na precisão dos cálculos. Portanto, nem todas as funções canônicas têm suporte para todos os bancos de dados e nem todas as funções canônicas retornam os mesmos resultados.

Grupo Funções canônicas
Funções agregadas Avg, BigCount, Count, Max, Min, StDev, StDevP, Soma, Var, VarP
Funções matemáticas Abs, teto, piso, força, redondo, truncado
Funções de string Concat, Contains, EndsWith, IndexOf, Left, Length, LTrim, Replace, Reverse, Right, RTrim, Substring, StartsWith, ToLower, ToUpper, Trim
Funções de data e hora AddMicroseconds, AddMilliseconds, AddSeconds, AddMinutes, AddHours, AddNanoseconds, AddDays, AddYears, CreateDateTime, AddMonths, CreateDateTimeOffset, CreateTime, CURRENTDATETIME, CurrentDateTimeOffset, CurrentUtcDateTime, Dia, DiaDoAno, DiffNanoseconds, DiffMilliseconds, DiffMicroseconds, DiffSeconds, DiffMinutes, DiffHours, DiffDays, DiffMonths, DiffYears, GetTotalOffsetMinutes, Hour, Millisecond, Minute, Month, Second, TruncateTime, Year
Funções bit a bit BitWiseAnd, BitWiseNot, BitWiseOr, BitWiseXor
Outras funções NewGuid

LINQ to Entities

O provedor LINQ to Entities permite que LINQ seja usado para consultar várias fontes de dados RDBMS . Vários provedores específicos de servidor de banco de dados com suporte ao Entity Framework estão disponíveis.

SQL nativo

No Entity Framework v4, novos métodos ExecuteStoreQuery () e ExecuteStoreCommand () foram adicionados à classe ObjectContext.

Visualizadores

O Visual Studio possui um recurso chamado Visualizer. Uma consulta LINQ escrita no Visual Studio pode ser vista como SQL nativo usando um Visualizer durante a sessão de depuração. Um Visualizador para LINQ to Entities (Object Query) direcionado a todos os RDBMS está disponível em "VisualStudioGallery".

Entity Framework Profiler

O Entity Framework Profiler é uma ferramenta Object – Relational Mapping (ORM) que irá solucionar problemas de desempenho em um aplicativo ASP.NET usando o Entity Framework. Ele verifica as ineficiências comuns de consulta de banco de dados, como o problema do SELECT N + 1.

Veja também

Referências

Bibliografia

links externos