新しいを使用する代わりに、コードファーストを使用してプロパティ/列にインデックスを作成する方法はありIndexAttribute
ますか?
新しいを使用する代わりに、コードファーストを使用してプロパティ/列にインデックスを作成する方法はありIndexAttribute
ますか?
回答:
さて、26.10.2017 Entity Framework 6.2が正式にリリースされました。これは、可能性が流暢APIを介して簡単にインデックスを定義するために。使うほうは6.2のベータで既に発表されていました。
これでメソッドを使用できるようになりHasIndex()
、その後にIsUnique()
一意のインデックスにする必要があるかどうかが続きます。
ほんの少しの比較(前/後)の例:
// before
modelBuilder.Entity<Person>()
.Property(e => e.Name)
.HasColumnAnnotation(
IndexAnnotation.AnnotationName,
new IndexAnnotation(new IndexAttribute { IsUnique = true }));
// after
modelBuilder.Entity<Person>()
.HasIndex(p => p.Name)
.IsUnique();
// multi column index
modelBuilder.Entity<Person>()
.HasIndex(p => new { p.Name, p.Firstname })
.IsUnique();
でクラスタ化されているものとしてインデックスをマークすることもでき.IsClustered()
ます。
編集#1
複数列のインデックスの例と、インデックスをクラスター化としてマークする方法に関する追加情報を追加しました。
編集#2
追加情報として、EF Core 2.1では、EF 6.2とまったく同じです。
以下は参考としてMS Docの記事です。
new
。私はそれを修正します。
現在、Fluent APIを介してインデックスを作成するための「ファーストクラスサポート」はありませんが、Fluent APIを介してできることは、プロパティをAnnotation APIからの属性を持つものとしてマークすることです。これIndex
により、流れるようなインターフェイスを介して属性を追加できます。
EFの問題サイトのワークアイテムの例をいくつか示します。
単一の列にインデックスを作成します。
modelBuilder.Entity<MyEntity>()
.Property(e => e.MyProperty)
.HasColumnAnnotation(
IndexAnnotation.AnnotationName,
new IndexAnnotation(new IndexAttribute()));
1つの列に複数のインデックス:
modelBuilder.Entity<MyEntity>()
.Property(e => e.MyProperty)
.HasColumnAnnotation(
IndexAnnotation.AnnotationName,
new IndexAnnotation(new[]
{
new IndexAttribute("Index1"),
new IndexAttribute("Index2") { IsUnique = true }
}));
複数列インデックス:
modelBuilder.Entity<MyEntity>()
.Property(e => e.MyProperty1)
.HasColumnAnnotation(
IndexAnnotation.AnnotationName,
new IndexAnnotation(new IndexAttribute("MyIndex", 1)));
modelBuilder.Entity<MyEntity>()
.Property(e => e.MyProperty2)
.HasColumnAnnotation(
IndexAnnotation.AnnotationName,
new IndexAnnotation(new IndexAttribute("MyIndex", 2)));
上記の手法を使用すると、次のマイグレーションを足場するときに関数.CreateIndex()
内で呼び出しが自動的に作成されますUp()
(または、マイグレーションを使用していない場合は、データベースに自動的に作成されます)。
.Primarykey(x=>x.id,clustered:false)
メソッドでclusered:falseを指定して作成された移行ファイルから明示的に削除する必要があります
HasAnnotation
方法を試しましたが、このような方法はありません。しかし、私はHasColumnAnnotation
あなたが提供するパラメータを受け入れる名前のメソッドを見つけました。回答を更新する必要がありますか、それとも間違いですか?
いくつかの拡張メソッドを作成し、それらをnugetパッケージにラップして、これをはるかに簡単にしました。
EntityFramework.IndexingExtensions
nugetパッケージをインストールします。
次に、以下を実行できます。
public class MyDataContext : DbContext
{
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Customer>()
.HasIndex("IX_Customers_Name", // Provide the index name.
e => e.Property(x => x.LastName), // Specify at least one column.
e => e.Property(x => x.FirstName)) // Multiple columns as desired.
.HasIndex("IX_Customers_EmailAddress", // Supports fluent chaining for more indexes.
IndexOptions.Unique, // Supports flags for unique and clustered.
e => e.Property(x => x.EmailAddress));
}
}
プロジェクトとソースコードはこちらです。楽しい!
IndexAttribute
クラスでは公開されていないため、ライブラリに含めることはできません。
明示的な名前なし:
[Index]
public int Rating { get; set; }
特定の名前で:
[Index("PostRatingIndex")]
public int Rating { get; set; }
EntityFramework
。それはそのアセンブリに含まれています。ちょうどNSについて混乱しています。
instead of using the new IndexAttribute
が含まれています。
EF 6.1以降では、この属性[Index]
がサポートされています。一意のインデックスに
使用[Index(IsUnique = true)]
します。
ここにマイクロソフトからのリンクがあります
public class User
{
public int UserId { get; set; }
[Index(IsUnique = true)]
[StringLength(200)]
public string Username { get; set; }
public string DisplayName { get; set; }
}
[Index("IX_BlogIdAndRating", 2)]
public int Rating { get; set; }
[Index("IX_BlogIdAndRating", 1)]
public int BlogId { get; set; }
ここでは、Microsoft
エンティティフレームワーク6
Property(c => c.MyColumn)
.HasColumnAnnotation("Index", new IndexAnnotation(new IndexAttribute("IX_MyIndex")));
そして使用して追加:
using System.Data.Entity.Infrastructure.Annotations;
using System.ComponentModel.DataAnnotations.Schema;
INDEXデータアノテーションコードファーストデータアノテーションを使用できます。
POCOで属性を使用したくない場合は、次のようにいつでも実行できます。
context.Database.ExecuteSqlCommand("CREATE INDEX IX_NAME ON ...");
このステートメントは、カスタムDbInitializer
派生クラスで実行できます。私はこれを行うためのFluent APIの方法を知りません。
追加のコードを回避するために、流暢なEFで使用する拡張メソッドを作成します。
public static PrimitivePropertyConfiguration HasIndexAnnotation(
this PrimitivePropertyConfiguration primitivePropertyConfiguration,
IndexAttribute indexAttribute = null
)
{
indexAttribute = indexAttribute ?? new IndexAttribute();
return primitivePropertyConfiguration
.HasColumnAnnotation(
IndexAnnotation.AnnotationName,
new IndexAnnotation(indexAttribute)
);
}
次に、次のように使用します。
Property(t => t.CardNo)
.HasIndexAnnotation();
または、インデックスにいくつかの設定が必要な場合は、次のようにします。
Property(t => t.CardNo)
.HasIndexAnnotation(new IndexAttribute("IX_Account") { IsUnique = true });
あなたはこれの1つを使うことができます
//インデックス
this.HasIndex(e => e.IsActive)
.HasName("IX_IsActive");
または
this.Property(e => e.IsActive).HasColumnAnnotation(
"Index",
new IndexAnnotation(new IndexAttribute("IX_IsActive")));