new를 사용하는 대신 코드 우선을 사용하여 속성 / 열에 인덱스를 만드는 방법이 IndexAttribute
있습니까?
new를 사용하는 대신 코드 우선을 사용하여 속성 / 열에 인덱스를 만드는 방법이 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
. 내가 고칠 게.
현재 유창한 API를 통해 색인을 생성하기위한 "일급 지원" 은 없지만 유창한 API를 통해 속성을 Annotation API의 속성이있는 것으로 표시 할 수 있습니다. 이렇게하면 Index
유창한 인터페이스를 통해 속성 을 추가 할 수 있습니다 .
다음은 EF에 대한 문제 사이트의 작업 항목에 대한 몇 가지 예입니다.
단일 열에 인덱스를 만듭니다.
modelBuilder.Entity<MyEntity>()
.Property(e => e.MyProperty)
.HasColumnAnnotation(
IndexAnnotation.AnnotationName,
new IndexAnnotation(new IndexAttribute()));
단일 열에 여러 인덱스 :
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
너겟 패키지를 설치하십시오 .
그런 다음 다음을 수행 할 수 있습니다.
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)]
합니다.
다음은 Microsoft 의 링크입니다.
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; }
의 참조
Entity Framework 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 });
이 중 하나를 사용할 수 있습니다
// 인덱스
this.HasIndex(e => e.IsActive)
.HasName("IX_IsActive");
또는
this.Property(e => e.IsActive).HasColumnAnnotation(
"Index",
new IndexAnnotation(new IndexAttribute("IX_IsActive")));