क्या कोड-प्रथम का उपयोग करके किसी गुण / स्तंभ पर एक इंडेक्स बनाने का एक तरीका है, बजाय नए का उपयोग करने के IndexAttribute
?
क्या कोड-प्रथम का उपयोग करके किसी गुण / स्तंभ पर एक इंडेक्स बनाने का एक तरीका है, बजाय नए का उपयोग करने के IndexAttribute
?
जवाबों:
खैर 26.10.2017 एंटिटी फ्रेमवर्क 6.2 आधिकारिक तौर पर जारी किया गया था । इसमें धाराप्रवाह एपीआई के माध्यम से आसानी से अनुक्रमित को परिभाषित करने की संभावना शामिल है । हो यह उपयोग करने के लिए पहले से ही 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()
।
EDIT # 1
बहु कॉलम इंडेक्स और अतिरिक्त जानकारी के लिए एक उदाहरण जोड़ा गया कि कैसे इंडेक्स को क्लस्टर किया जाए।
EDIT # 2
अतिरिक्त जानकारी के रूप में, EF Core 2.1 में यह EF 6.2 की तरह ही है।
यहाँ संदर्भ के रूप में MS Doc आर्टसील है।
new
। मैं इसे ठीक कर दूंगा।
वर्तमान में धाराप्रवाह एपीआई के माध्यम से एक सूचकांक बनाने के लिए कोई "प्रथम श्रेणी का समर्थन" नहीं है, लेकिन आप धाराप्रवाह एपीआई के माध्यम से क्या कर सकते हैं आप एनोटेशन एपीआई से विशेषताओं के रूप में गुणों को चिह्नित कर सकते हैं। यह आपको Index
एक धाराप्रवाह इंटरफ़ेस के माध्यम से विशेषता जोड़ने की अनुमति देगा ।
ईएफ के लिए इश्यू साइट से कार्य मद के कुछ उदाहरण यहां दिए गए हैं।
एकल कॉलम पर एक इंडेक्स बनाएं:
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)
विधि
HasAnnotation
विधि की कोशिश की और इस तरह कोई विधि नहीं है। लेकिन मुझे एक ऐसा तरीका मिला जो एक नाम है HasColumnAnnotation
जो उन मापदंडों को स्वीकार करता है जो आप प्रदान करते हैं। क्या आपको अपना उत्तर अपडेट करने की आवश्यकता है या मैं गलत हूं?
मैंने कुछ विस्तार विधियाँ बनाई हैं और इसे बहुत आसान बनाने के लिए एक नगेट पैकेज में लपेटा है।
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
। यह उस विधानसभा में शामिल है। बस एनएस के बारे में उलझन में है।
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; }
यहाँ Microsoft
इकाई ढाँचा ६
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
व्युत्पन्न वर्ग में निष्पादित कर सकते हैं । हालांकि मुझे ऐसा करने का कोई धाराप्रवाह एपीआई तरीका नहीं पता है।
मैं अतिरिक्त कोड से बचने के लिए धाराप्रवाह ईएफ में उपयोग के लिए एक विस्तार विधि लिखता हूं:
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")));