Bir mülk / sütun üzerinde yeniyi kullanmak yerine önce kodu kullanarak dizin oluşturmanın bir yolu var mı IndexAttribute?
Bir mülk / sütun üzerinde yeniyi kullanmak yerine önce kodu kullanarak dizin oluşturmanın bir yolu var mı IndexAttribute?
Yanıtlar:
Peki 26.10.2017 Entity Framework 6.2 resmi olarak yayınlandı . Fluent API aracılığıyla dizinleri kolaylıkla tanımlama olanağını içerir . Kullanılacaksa zaten 6.2 beta sürümünde duyurulmuştu .
Artık HasIndex()yöntemi, ardından IsUnique()benzersiz bir dizin olması gerekiyorsa kullanabilirsiniz.
Küçük bir karşılaştırma (önce / sonra) örneği:
// 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();
Dizini kümelenmiş olarak işaretlemek de mümkündür .IsClustered().
DÜZENLE # 1
Çok sütunlu dizin için bir örnek ve bir dizinin kümelenmiş olarak nasıl işaretleneceği hakkında ek bilgi eklendi.
DÜZENLE # 2
Ek bilgi olarak, EF Core 2.1'de, şimdi EF 6.2'deki ile tamamen aynıdır.
İşte referans olarak MS Doc makalesi.
new. Düzelteceğim.
Şu anda akıcı API aracılığıyla bir dizin oluşturmak için "birinci sınıf destek" yoktur , ancak akıcı API aracılığıyla yapabileceğiniz şey, özellikleri Ek Açıklama API'sinden özelliklere sahip olarak işaretleyebilirsiniz. Bu, Indexözelliği akıcı bir arayüz aracılığıyla eklemenize izin verecektir .
İşte EF için Sorunlar sitesindeki çalışma öğesinden bazı örnekler.
Tek bir sütunda bir dizin oluşturun:
modelBuilder.Entity<MyEntity>()
.Property(e => e.MyProperty)
.HasColumnAnnotation(
IndexAnnotation.AnnotationName,
new IndexAnnotation(new IndexAttribute()));
Tek bir sütunda birden çok dizin:
modelBuilder.Entity<MyEntity>()
.Property(e => e.MyProperty)
.HasColumnAnnotation(
IndexAnnotation.AnnotationName,
new IndexAnnotation(new[]
{
new IndexAttribute("Index1"),
new IndexAttribute("Index2") { IsUnique = true }
}));
Çok Sütunlu dizinler:
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)));
Yukarıdaki tekniklerin kullanılması, bir sonraki geçişinizi yapılandırdığınızda işlevinizde .CreateIndex()sizin için otomatik olarak çağrıların oluşturulmasına Up()(veya geçişleri kullanmıyorsanız veritabanında otomatik olarak oluşturulmasına) neden olacaktır.
.Primarykey(x=>x.id,clustered:false)yöntemi belirtilerek oluşturulan geçiş dosyasından açıkça kaldırılması gerekir
HasAnnotationYöntemi denedim ve bunun gibi bir yöntem yok. ama HasColumnAnnotationsağladığınız parametreleri kabul eden isimli bir yöntem buldum . Cevabınızı güncellemeniz mi gerekiyor yoksa yanılıyor muyum?
Bunu daha kolay hale getirmek için bazı uzantı yöntemleri oluşturdum ve bunları bir nuget paketine sardım.
EntityFramework.IndexingExtensionsNuGet paketini kurun .
Daha sonra şunları yapabilirsiniz:
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));
}
}
Proje ve kaynak kodu burada . Zevk almak!
IndexAttributesınıfı tarafından gösterilmiyor , bu yüzden onu kitaplığıma ekleyemiyorum .
Açık bir isim olmadan:
[Index]
public int Rating { get; set; }
Belirli bir adla:
[Index("PostRatingIndex")]
public int Rating { get; set; }
EntityFramework. bu derlemeye dahildir. NS hakkında kafam karıştı.
instead of using the new IndexAttributefark ettiniz mi?
EF 6.1'den itibaren öznitelik [Index]desteklenmektedir. Benzersiz dizin için
kullanın [Index(IsUnique = true)].
İşte Microsoft'un bağlantısı
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; } İşte Microsoft
Entity Framework 6
Property(c => c.MyColumn)
.HasColumnAnnotation("Index", new IndexAnnotation(new IndexAttribute("IX_MyIndex")));
Ve şunu kullanarak ekleyin:
using System.Data.Entity.Infrastructure.Annotations;
using System.ComponentModel.DataAnnotations.Schema;
INDEX veri açıklama Kod İlk Veri Açıklamalarını kullanabilirsiniz
POCO'larınızda öznitelikler kullanmak istemiyorsanız, bunu her zaman aşağıdaki gibi yapabilirsiniz:
context.Database.ExecuteSqlCommand("CREATE INDEX IX_NAME ON ...");
Bu ifadeyi özel DbInitializertüretilmiş sınıfınızda çalıştırabilirsiniz. Yine de bunu yapmanın herhangi bir Fluent API yolunu bilmiyorum.
Ekstra koddan kaçınmak için akıcı EF'de kullanmak için bir uzantı yöntemi yazıyorum:
public static PrimitivePropertyConfiguration HasIndexAnnotation(
this PrimitivePropertyConfiguration primitivePropertyConfiguration,
IndexAttribute indexAttribute = null
)
{
indexAttribute = indexAttribute ?? new IndexAttribute();
return primitivePropertyConfiguration
.HasColumnAnnotation(
IndexAnnotation.AnnotationName,
new IndexAnnotation(indexAttribute)
);
}
sonra şu şekilde kullanın:
Property(t => t.CardNo)
.HasIndexAnnotation();
veya indeks bazı yapılandırmalara ihtiyaç duyarsa bunun gibi:
Property(t => t.CardNo)
.HasIndexAnnotation(new IndexAttribute("IX_Account") { IsUnique = true });
Bunlardan birini kullanabilirsin
// Dizinler
this.HasIndex(e => e.IsActive)
.HasName("IX_IsActive");
veya
this.Property(e => e.IsActive).HasColumnAnnotation(
"Index",
new IndexAnnotation(new IndexAttribute("IX_IsActive")));