EF Core 2.2 の新機能

空間データのサポート

オブジェクトの物理的な場所と形状を表現するために、空間データを使用できます。 多くのデータベースでは、空間データの格納、インデックス付け、照会をネイティブで実行できます。 一般的なシナリオとしては、特定の距離内にあるオブジェクトにクエリを実行する場合や、特定の場所が多角形に含まれるかどうかテストする場合などがあります。 EF Core 2.2 では、NetTopologySuite (NTS) ライブラリからの型を使用して、さまざまなデータベースの空間データを操作できるようになりました。

空間データのサポートは、一連のプロバイダー固有の拡張機能パッケージとして実装されています。 これらの各パッケージには、NTS 型用のマッピングとメソッド、および対応するデータベースの空間型と関数が用意されています。 現在、このようなプロバイダーの拡張機能は SQL ServerSQLite、(Npgsql プロジェクトの) PostgreSQL で使用できます。 空間型は、追加の拡張機能なしで、EF Core のメモリ内プロバイダーと共に直接使用できます。

プロバイダーの拡張機能をインストールすると、サポートされている型のプロパティをエンティティに追加できます。 次に例を示します。

using NetTopologySuite.Geometries;

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

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

その後、空間データを含むエンティティを保持できます。

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

さらに、空間のデータと操作に基づくデータベース クエリを実行できます。

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

この機能について詳しくは、空間型に関するドキュメントをご覧ください。

所有エンティティのコレクション

EF Core 2.0 では、一対一の関連付けで所有権をモデル化する機能が追加されました。 EF Core 2.2 では、所有権を表す機能が一対多の関連付けに拡張されました。 所有権は、エンティティの使用方法を制限するのに役立ちます。

たとえば、所有エンティティは:

  • その他のエンティティ型のナビゲーション プロパティにのみ現れます。
  • 自動的に読み込まれ、DbContext とその所有者によってのみ追跡されます。

リレーショナル データベースでは、所有されているコレクションは通常の一対多の関連付けと同じように、所有者から個別のテーブルにマッピングされます。 ただし、ドキュメント指向のデータベースでは、所有者と同じドキュメント内で、(所有しているコレクションまたは参照で) 所有エンティティを入れ子にする予定です。

この機能を使用するには、新しい OwnsMany() API を呼び出します。

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

詳細については、所有エンティティの更新に関するドキュメントをご覧ください。

クエリのタグ

この機能により、コード内の LINQ クエリと、ログでキャプチャされる生成済みの SQL クエリの関連付けが簡略化されます。

クエリのタグを利用するには、新しい TagWith() メソッドを使用して LINQ クエリに注釈を付けます。 前の例の空間クエリを使用します。

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

この LINQ クエリは次の 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

詳細については、クエリのタグに関するドキュメントをご覧ください。