Novos recursos no EF Core 2.2

Suporte a dados espaciais

Os dados espaciais podem ser usados para representar a localização física e a forma dos objetos. Muitos bancos de dados podem armazenar, indexar e consultar dados espaciais nativamente. Cenários comuns incluem a consulta de objetos a uma determinada distância e o teste se um polígono contém um determinado local. O EF Core 2.2 agora dá suporte ao trabalho com dados espaciais de vários bancos de dados usando tipos da biblioteca NTS ( NetTopologySuite ).

O suporte a dados espaciais é implementado como uma série de pacotes de extensão específicos do provedor. Cada um desses pacotes contribui com mapeamentos para tipos e métodos NTS e os tipos espaciais e funções correspondentes no banco de dados. Essas extensões de provedor agora estão disponíveis para SQL Server, SQLite e PostgreSQL (do projeto Npgsql). Tipos espaciais podem ser usados diretamente com o provedor de memória do EF Core sem extensões adicionais.

Depois que a extensão do provedor for instalada, você poderá adicionar propriedades de tipos com suporte às suas entidades. Por exemplo:

using NetTopologySuite.Geometries;

namespace MyApp
{
  public class Friend
  {
    [Key]
    public string Name { get; set; }

    [Required]
    public Point Location { get; set; }
  }
}

Em seguida, você pode persistir entidades com dados espaciais:

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

E você pode executar consultas de banco de dados com base em dados espaciais e operações:

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

Para obter mais informações sobre esse recurso, consulte a documentação de tipos espaciais.

Coleções de entidades de propriedade

O EF Core 2.0 adicionou a capacidade de modelar a propriedade em associações um para um. O EF Core 2.2 estende a capacidade de expressar relacionamentos de propriedade para associações um para muitos. A propriedade ajuda a restringir como as entidades são usadas.

Por exemplo, entidades de propriedade:

  • Só pode aparecer em propriedades de navegação de outros tipos de entidade.
  • São carregados automaticamente e só podem ser monitorados por um DbContext em associação com seu proprietário.

Em bancos de dados relacionais, coleções pertencentes são mapeadas para tabelas separadas do proprietário, de forma similar às associações regulares de um para muitos. Mas, em bancos de dados orientados a documentos, planejamos aninhar entidades de propriedade (em coleções ou referências de propriedade) dentro do mesmo documento que o proprietário.

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

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

Para obter mais informações, consulte a documentação de entidades de propriedade atualizada.

Etiquetas de consulta

Esse recurso simplifica a correlação de consultas LINQ no código com consultas SQL geradas capturadas em logs.

Para aproveitar as marcas de consulta, você anota uma consulta LINQ usando o novo método TagWith(). Usando a consulta espacial de um exemplo anterior:

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

Essa consulta LINQ produzirá a seguinte saída SQL:

-- 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

Para obter mais informações, consulte a documentação de marcas de consulta.