Lançamento do Entity Framework Core 2.2. Novidades (3 de 3)

Em 4 de dezembro, a versão final do EF Core 2.2 foi lançada. Foi lançado em paralelo com o ASP.NET Core 2.2 e o .NET Core 2.2 e é a versão mais recente de nossa tecnologia de código aberto e de plataforma cruzada para gerenciar mapeamentos entre objetos de linguagem e um banco de dados.


O EF Core 2.2 RTM contém mais de cem correções e vários novos recursos, sobre os quais falaremos neste artigo.


Os links levam a artigos correspondentes sobre Habré. Este é o último, terceiro artigo da série. Na próxima vez, falaremos sobre um novo lançamento - e será no novo ano.



Dados espaciais


Dados espaciais são usados ​​para armazenar a localização física e a forma dos objetos. Muitos bancos de dados existentes possuem métodos internos para armazenar, indexar e recuperar esses dados. Os principais cenários de uso estão procurando objetos a uma distância selecionada e verificando se alguns dos polígonos contêm um determinado ponto. O EF Core 2.2 agora poderá trabalhar com esses bancos de dados e dados geográficos, usando tipos da biblioteca NetTopologySuite (NTS).


Os dados espaciais são implementados como conjuntos de pacotes de extensão para provedores especiais. Cada um desses pacotes adiciona novos mapeamentos para tipos e métodos NTS e os tipos e funções espaciais correspondentes no banco de dados. Essas extensões de provedor já foram implementadas para SQL Server, SQLite e PostgreSQL (graças ao projeto Npgsql). Os tipos espaciais podem ser usados ​​diretamente, juntamente com o provedor de memória EF Core, sem o uso de outras extensões.


Depois que a extensão é instalada, o suporte para novos tipos é incluído. Propriedades com esses tipos podem ser usadas em suas entidades, por exemplo:


using NetTopologySuite.Geometries; namespace MyApp { public class Friend { [Key] public string Name { get; set; } [Required] public Point Location { get; set; } } } 

Claro, agora você pode salvar esses dados:


 using (var context = new MyDbContext()) { context.Add( new Friend { Name = "Bill", Location = new Point(-122.34877, 47.6233355) {SRID = 4326 } }); context.SaveChanges(); } 

Da mesma forma, torna-se possível fazer consultas ao banco de dados que envolvem dados e operações espaciais:


  var nearestFriends = (from f in context.Friends orderby f.Location.Distance(myLocation) descending select f).Take(5).ToList(); 

Dados espaciais é um tópico importante com o qual você deve começar com a documentação oficial .


Coleções de Entidades Dependentes


O EF Core 2.0 apresenta a capacidade de modelar relacionamentos um a um. O EF Core 2.2 estende esse recurso com a capacidade de indicar diretamente quem é a entidade principal (proprietário) e quem é dependente (de propriedade). Isso permite limitar e esclarecer o escopo da entidade.


Por exemplo, entidades dependentes:


  • Eles podem ser usados ​​apenas em propriedades de referência ( inglês “propriedade de navegação” ) contidas em outros tipos de entidades;
  • Carregado e rastreado automaticamente no DbContext somente junto com sua entidade principal.

Nos bancos de dados relacionais, as coleções dependentes não são exibidas na tabela da entidade principal, mas em tabelas separadas, semelhantes às relações um-para-muitos usuais. Nos bancos de dados orientados a documentos, tudo é um pouco diferente, e planejamos incorporar entidades dependentes (em coleções ou links dependentes) no mesmo documento em que a entidade principal está armazenada.


Você pode usar o recurso chamando a nova API OwnsMany() :


 modelBuilder.Entity<Customer>().OwnsMany(c => c.Addresses); 

Para mais informações, consulte a documentação .


Tags de consulta


Esse recurso visa simplificar a tarefa de localizar uma conexão entre as consultas LINQ no código e as consultas SQL geradas a partir delas, que podem ser encontradas nos logs.


Para habilitar tags, anote a consulta LINQ usando o novo método TagWith() . Vamos modificar um pouco o exemplo anterior da seção de dados espaciais:


  var nearestFriends = (from f in context.Friends.TagWith(@"This is my spatial query!") orderby f.Location.Distance(myLocation) descending select f).Take(5).ToList(); 

Você pode ver o seguinte texto no log:


 -- This is my spatial query! SELECT TOP(@__p_1) [f].[Name], [f].[Location] FROM [Friends] AS [f] ORDER BY [f].[Location].STDistance(@__myLocation_0) DESC 

Como sempre, há uma [seção na documentação] sobre isso.


Compatível com EF Core 2.1


Nós gastamos muito tempo e esforço garantindo compatibilidade com versões anteriores do EF Core 2.2 com provedores existentes do EF Core 2.1 e fazendo com que, após a atualização para o EF Core 2.2, o aplicativo fosse montado sem problemas visíveis. Muito provavelmente, na maioria dos casos, a migração para a nova versão será simples, mas, mesmo assim, se você encontrar problemas repentinamente, vale a pena falar sobre eles em nosso bugtracker .


No momento, há apenas uma alteração que pode exigir pequenas alterações no código do aplicativo. Você pode ler sobre isso na descrição do seguinte ticket:


  • # 13986 : Um tipo configurado como propriedade regular e dependente exige a criação de uma chave primária imediatamente após a atualização de 2.1 para 2.2.

Pretendemos continuar mantendo e atualizando a lista de problemas que exigem modificação do código antigo.


O que vem a seguir: EF Core 3.0


Após o lançamento da versão 2.2, nosso próximo objetivo é o EF Core 3.0. Ainda não implementamos novos recursos, portanto, os pacotes NuGet lançados em 4 de dezembro contêm apenas algumas pequenas alterações feitas após o lançamento do EF Core 2.2.


Já existem várias grandes idéias amplamente discutidas planejadas para o próximo lançamento. Queremos falar sobre eles em comunicados de imprensa futuros, mas aqui estão alguns tópicos sobre os quais você já pode dizer algo:


  • Melhorias no LINQ . O LINQ permite que você escreva consultas de banco de dados sem precisar alternar do idioma principal para o idioma do banco de dados, usando informações de tipo para exibir o IntelliSense e validar em tempo de compilação. Mas isso também significa que o LINQ permite que você escreva um número ilimitado de consultas complexas, que sempre foram um desafio real para os provedores do LINQ. Nas primeiras versões do EF Core, resolvemos esse problema determinando quais partes da solicitação podem ser convertidas em SQL e, em seguida, permitindo que o restante da solicitação seja executado diretamente no cliente, usando a memória desse cliente. Às vezes, essa execução do lado do cliente pode ser útil, mas em muitos casos leva a solicitações extremamente ineficientes que não podem ser encontradas até que o código entre em produção. O EF Core 3.0 quer fazer um trabalho completo de alteração de componentes internos do LINQ e como testá-los. É necessário torná-los mais duráveis ​​e confiáveis ​​(por exemplo, para que as solicitações não sejam interrompidas após o lançamento de novas correções); implementar a tradução correta no SQL de um número maior de expressões; concentre-se em gerar consultas que funcionarão com mais eficiência em mais casos; considerar que solicitações ineficientes não passam despercebidas.


  • Suporte ao Cosmos DB . Continuamos a trabalhar no provedor Cosmos DB do EF Core para que os desenvolvedores familiarizados com o modelo de programação EF possam direcionar imediatamente o Azure Cosmos DB como sua base principal. O desafio é aproveitar o melhor do Cosmos DB, como distribuição global, disponibilidade "sempre ativa", escalabilidade elástica, baixa latência e assim por diante. O provedor EF Core deve fornecer a maioria dos recursos disponíveis. Começamos a fazer isso muito antes do EF Core 2.2 e até lançamos algumas versões preliminares . Continuaremos a desenvolver o provedor em paralelo com o EF Core 3.0.


  • Suporte para C # 8.0 . O C # 8.0 possui alguns novos recursos úteis , como fluxos assíncronos (incluindo await foreach ) e tipos de referência nulos suportados pelo EF Core.


  • Invertendo um banco de dados em tipos de consulta . O EF Core 2.1 adiciona suporte para tipos de consulta que representam dados que podem ser lidos no banco de dados, mas não podem ser atualizados. Eles são ótimos para modelar visualizações em bancos de dados SQL e, portanto, o EF Core 3.0 deseja automatizar sua criação.


  • Entidades da Bolsa de Propriedade . Isso adiciona entidades que armazenam dados não em propriedades comuns, mas em indexadas e pode usar instâncias da mesma classe no .NET (por exemplo, algo como Dictionary<string, object> ) para exibir muitos tipos diferentes de entidades em um e o mesmo modelo EF Core. Esse recurso é o próximo passo no caminho para relacionamentos muitos-para-muitos, sem o uso de entidades unificadoras - ou seja, um dos recursos mais esperados do EF Core.


  • EF 6.3 no .NET Core . Está claro que agora existem muitos aplicativos que usam o EF, e portá-los para o EF Core apenas para obter alguns benefícios do uso do .NET Core às vezes exige muito esforço. Portanto, adaptaremos a próxima versão do EF 6 para que também comece a funcionar no .NET Core 3.0. Isso é para incentivar os desenvolvedores a portar seus aplicativos para que eles tenham que alterar o mínimo de código possível. Obviamente, isso causará várias limitações (por exemplo, novos provedores serão necessários e o suporte a dados espaciais não será ativado para o SQL Server). Além disso, não planejamos adicionar recursos adicionais ao EF 6.



Conclusão


A equipe da EF agradece à comunidade pelo feedback de qualidade e assistência ao desenvolvimento que levaram à introdução do EF Core 2.2. Como sempre, lembramos que o novo ishshui pode ser adicionado diretamente ao nosso rastreador . Obrigada


Não se esqueça que os ingressos para DotNext a partir de 1º de janeiro aumentarão de preço. Pessoal - para mil, e Standard - para dois mil. Detalhes sobre Early Bird estão no site .

Source: https://habr.com/ru/post/pt433442/


All Articles