さて、質問は十分に明確です。Entity Framework 6.1 fluent API を使用して空間インデックスを作成することはできますか?
2 に答える
これを行う唯一の方法は、「カスタム」移行を使用することです。EF6 で移行を追加すると (以下の例では "V1" という名前が付けられています)、空の Up() メソッドと Down() メソッドを含む新しい移行が作成されます。これらのメソッドにカスタム SQL コマンドを追加してから update-database を実行し、これらを「通常の」移行フローに入れることができます。
既存の移行を変更してこれらの機能を追加することは可能ですが、実際には、自動的にスキャフォールディングされた移行をカスタマイズした移行とは別にしておくことを好みます。
public partial class V1 : DbMigration
{
public override void Up()
{
Sql("CREATE SPATIAL INDEX [IX_UserProfileAddresses_Location] ON [dbo].[UserProfileAddresses](Location)");
}
public override void Down()
{
Sql("DROP INDEX [IX_UserProfileAddresses_Location] ON [dbo].[UserProfileAddresses]");
}
}
理想的な方法ではありませんが、EF の「通常の」移行パターンに従うため、それほど悪くはありません。
短い答え - いいえ、そうではありません。私はこれがブログ全体で接線的に参照されているのを見てきましたが、実装の具体的な例は見つかりませんでした. これは、空間インデックスが Entity Framework でサポートされていないフィルター処理されたインデックスであるという事実に関連しているようです。
私の回答のサポートとして、最新バージョンの Entity Framework (6.1) を使用して POC コンソール アプリを構築しました。次の手順を実行しました
- タイプ DbGeography のプロパティを持つモデルを作成しました
- 自動移行を有効にしました
Update-Database -verbose を実行し、インデックスを追加して移行が実行されたことを確認しました。インデックスは次のものを使用しました。
modelBuilder.Entity<LocationEntity>().Property(t => t.Coordinates).HasColumnAnnotation("Index", new IndexAnnotation(new IndexAttribute("ix_locationentity_coordinates")));
インデックスは作成されませんでしたが、アプリがクラッシュすることもありませんでした。これについて順列を試すこともできますが、私の例はエンティティ フレームワークの規則に従っているようです:公式 Fluent ドキュメント