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
HasAnnotation
Yöntemi denedim ve bunun gibi bir yöntem yok. ama HasColumnAnnotation
sağ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.IndexingExtensions
NuGet 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!
IndexAttribute
sı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 IndexAttribute
fark 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 DbInitializer
tü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")));