web-dev-qa-db-ja.com

EFCoreで複合一意制約/インデックスを生成します

エンティティのNameプロパティに複合一意制約が必要です。これは、Categoryごとに一意です(FKがあります)。

だからこのようなもの:

entityTypeBuilder
  .HasIndex(i => new { i.Name, i.Category.Id })
  .IsUnique();

しかし、Category.Idナビゲーションプロパティが原因で、移行を生成するとこれは失敗します。

値を文字列としてハードコーディングできることは知っていますが、静的型付けを失いたくありません。

どのようなオプションがありますか?

13
grokky

問題のエンティティにカテゴリCategoryIdの外部キーを追加し、ナビゲーションプロパティの代わりにインデックスビルダーで使用します。

8
steamrolla

シャドウプロパティ名がわかればすぐに、(少なくともEF Core 1.1.0では)文字列ベースのHasIndexメソッド overload を使用できます。

public virtual IndexBuilder HasIndex(params string[] propertyNames)

例えば.

entityTypeBuilder
  .HasIndex("Name", "CategoryId")
  .IsUnique();

HasAlternateKeyについても同じです:

entityTypeBuilder
  .HasAlternateKey("Name", "CategoryId");
7
Ivan Stoev