पहले कोड के साथ इकाई फ्रेमवर्क 6.2 में सूचकांक कैसे बनाएं


112

क्या कोड-प्रथम का उपयोग करके किसी गुण / स्तंभ पर एक इंडेक्स बनाने का एक तरीका है, बजाय नए का उपयोग करने के IndexAttribute?


5
एक सूचकांक एक डेटाबेस अवधारणा है, न कि एक इकाई मॉडल अवधारणा। यहां तक ​​कि अगर आप एक विशेषता के साथ या धाराप्रवाह एपीआई के माध्यम से एक सूचकांक निर्दिष्ट कर सकते हैं, तो यह वास्तव में आपके आवेदन में कुछ भी नहीं करेगा। यह डेटाबेस बनाते समय EF का उपयोग करने के लिए एक निर्देश होगा। मेरा मानना ​​है कि ऐसे निर्देश कोड-प्रथम माइग्रेशन में होते हैं, जो पूरी तरह से डेटाबेस स्कीमा में हेरफेर करने से संबंधित है।
JC Ford

जवाबों:


84

खैर 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 आर्टसील है।


यह भी खूब रही! मुझे लगता है कि अगर मेरे पास बहुरंगी सूचकांक है तो यह कुछ इस तरह होगा: .HasIndex (p => new {p.Name, p.Xyz})
Valo

ओह, माफ करना, यकीन है। यह होना चाहिए new। मैं इसे ठीक कर दूंगा।
ChW

क्या आप बता सकते हैं कि हम कोर 2.x में समान कोड कैसे लिख सकते हैं?
user3417479

जहां तक ​​मुझे पता है कि यह "कोड" और "मल्टी कॉलम इंडेक्स" के तहत दिखाए गए समान कोड होना चाहिए।
ChW

87

वर्तमान में धाराप्रवाह एपीआई के माध्यम से एक सूचकांक बनाने के लिए कोई "प्रथम श्रेणी का समर्थन" नहीं है, लेकिन आप धाराप्रवाह एपीआई के माध्यम से क्या कर सकते हैं आप एनोटेशन एपीआई से विशेषताओं के रूप में गुणों को चिह्नित कर सकते हैं। यह आपको 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()फ़ंक्शन में आपके लिए स्वचालित रूप से कॉल किए जाने का कारण होगा जब आप अपना अगला माइग्रेशन मचान करते हैं (या यदि आप माइग्रेशन का उपयोग नहीं कर रहे हैं तो डेटाबेस में स्वचालित रूप से बनाया जा सकता है)।


4
वह स्तंभ पर अनुक्रमणिका जोड़ सकता है, लेकिन प्राथमिक कुंजी पर बनाए गए संकुल अनुक्रमणिका को हटाएगा नहीं। HasKey प्राथमिक कुंजी पर क्लस्टर इंडेक्स बनाता है जो डिफ़ॉल्ट रूप से हटाया नहीं जाता है। में झूठी: यह स्पष्ट रूप से बताते हुए clusered द्वारा बनाई गई माइग्रेशन फ़ाइल से हटा दिया जाना चाहिए .Primarykey(x=>x.id,clustered:false)विधि
जोय

8
मैंने HasAnnotationविधि की कोशिश की और इस तरह कोई विधि नहीं है। लेकिन मुझे एक ऐसा तरीका मिला जो एक नाम है HasColumnAnnotationजो उन मापदंडों को स्वीकार करता है जो आप प्रदान करते हैं। क्या आपको अपना उत्तर अपडेट करने की आवश्यकता है या मैं गलत हूं?
हकन फिकस्टीक

@ हकमफॉस्टोक I ने सीधे EF साइट से उदाहरण लिया। शायद किसी एक संस्करण में नाम बदल गया है या मूल संस्करण में कोई टाइपो है।
स्कॉट चैंबरलेन

3
इस वर्ष की शुरुआत में एक डिज़ाइन मीटिंग से निम्नलिखित लिंक के नीचे नीचे देखें: "नाम बदलें को HasColumnAnnotation (कोड आधार में अन्य प्रासंगिक स्थान)।" Unitframework.codeplex.com/…
ज़ैक चार्ल्स

36

मैंने कुछ विस्तार विधियाँ बनाई हैं और इसे बहुत आसान बनाने के लिए एक नगेट पैकेज में लपेटा है।

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)); 
  }
}

परियोजना और स्रोत कोड यहाँ हैं । का आनंद लें!


मैं वास्तव में पैकेज को पसंद करता हूं लेकिन ऐसा लगता है कि इंडेक्स नाम कभी-कभी अप स्क्रिप्ट में मचान के बाद गायब हो जाता है। यह केवल मेरे लिए दिखाई दिया जब मेरे सूचकांक में 4 या अधिक गुणों का उपयोग किया गया। मैं EF 6.1.3 के साथ काम कर रहा हूं।
मिक्सक्सीफॉइड

@Mixxiphoid - आप इस मुद्दे को लॉग इन करें होगा यहाँ विवरण समर्थन के साथ? यह भी सुनिश्चित करें कि आपके पास संस्करण 1.0.1 है, क्योंकि 1.0.0 में एक बग था ।
मैट जॉनसन-पिंट

मेरे पास संस्करण 1.0.1 है। मैं इस मुद्दे को लॉग इन करूंगा लेकिन इस समय ऐसा नहीं कर सकता।
मिक्सक्सीफॉइड

मैं अनुक्रमणिका कॉलम कॉलम को अवरोही क्रम में कैसे जोड़ूं? डिफ़ॉल्ट रूप से .HasIndex ("IX_Customers_EmailAddress", IndexOptions.Unique, ... सूचकांक में सभी भाग लेने वाले स्तंभों के लिए आरोही क्रम बनाता है।
GDroid

@GDroid - दुर्भाग्य से, यह ईएफ की IndexAttributeकक्षा द्वारा उजागर नहीं किया गया है , इसलिए मैं इसे अपने पुस्तकालय में शामिल नहीं कर सकता।
मैट जॉनसन-पिंट

24

एक स्पष्ट नाम के बिना:

[Index]
public int Rating { get; set; } 

एक विशिष्ट नाम के साथ:

[Index("PostRatingIndex")] 
public int Rating { get; set; }

इंडेक्स से लगता है :(
हमीद जकरी मीब

1
@HamedZakeryMiab आप एंटिटी फ्रेमवर्क के किस संस्करण का उपयोग कर रहे हैं? सूचकांक में कमी नहीं की गई थी।
ह्यूगो हिलोरियो

माफ करना, मैं शामिल करना भूल गया EntityFramework। यह उस विधानसभा में शामिल है। बस एनएस के बारे में उलझन में है।
बजे जकीरी मीब

@HamedZakeryMiab हाँ जो सुपर भ्रामक था! मुझे लगा कि यह System.DataAnnotations का हिस्सा था! यह निश्चित रूप से इकाई ढांचा पैकेज है
अल्बाट्रॉसकैफ़

3
प्रश्न में निम्नलिखित कथन शामिल है instead of using the new IndexAttributeक्या आपने इसे नोटिस किया है?
हकन फिएस्टक

22

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; } 
}

2
जब भी यह सैद्धांतिक रूप से प्रश्न का उत्तर दे सकता है, तो यहां उत्तर के आवश्यक भागों को शामिल करना और संदर्भ के लिए लिंक प्रदान करना बेहतर होगा
इनामुल हसन

@manetsus बहुत अच्छी तरह से। मैंने बदलाव को दर्शाने के लिए एक कोड स्निपेट जोड़ा।
डेरी डोरल्यूस

3
स्ट्रिंग की लंबाई की आवश्यकता है अन्यथा आप एक 'एक प्रकार का है जो एक सूचकांक में एक प्रमुख स्तंभ के रूप में उपयोग के लिए अमान्य है' अपवाद है। मेरे कोलीगेट ने मॉडलटेक्स्टल समाधान को कॉनटेक्स्ट पर तरजीह दी ताकि आप अपने उपयोगकर्ता वर्ग को अव्यवस्थित न करें, जो मुझे लगता है कि मान्य है।
andrew pate

विशिष्टता के लिए कई स्तंभों के साथ अनुक्रमणिका के बारे में क्या? एक मल्टी-कॉलम यूनीक की इंडेक्स के लिए काफी सामान्य ...
enorl76

1
@ enorl76 यह भी समर्थित है। प्रत्येक कॉलम के लिए आपको निम्नलिखित की तरह एक विशेषता का उपयोग करने की आवश्यकता होगी, [Index("IX_BlogIdAndRating", 2)] public int Rating { get; set; } [Index("IX_BlogIdAndRating", 1)] public int BlogId { get; set; } यहाँ Microsoft
Darie Dorlus

8

इकाई ढाँचा ६

Property(c => c.MyColumn)
        .HasColumnAnnotation("Index", new IndexAnnotation(new IndexAttribute("IX_MyIndex")));

और का उपयोग कर जोड़ें:

using System.Data.Entity.Infrastructure.Annotations;
using System.ComponentModel.DataAnnotations.Schema;

7

आप INDEX डेटा एनोटेशन कोड फर्स्ट डेटा एनोटेशन का उपयोग कर सकते हैं


3
अधिकतम प्रमुख लंबाई nvarchar के लिए 900 बाइट्स और varchar के लिए 450 बाइट्स है। यदि आप पहले कोड का उपयोग कर रहे हैं, तो स्ट्रिंग गुण nvarchar होंगे और आपको इसमें विशेषता "StringLength" को शामिल करना चाहिए जैसे [[StringLength (450)]
dunwan

EF 6.1 के रूप में, यह सही उत्तर है। docs.microsoft.com/en-us/ef/ef6/modeling/code-first/…
क्रिस स्कॉलर

2

यदि आप अपने POCO पर विशेषताओं का उपयोग नहीं करना चाहते हैं, तो आप इसे हमेशा निम्न की तरह कर सकते हैं:

context.Database.ExecuteSqlCommand("CREATE INDEX IX_NAME ON ..."); 

आप इस कथन को अपने कस्टम DbInitializerव्युत्पन्न वर्ग में निष्पादित कर सकते हैं । हालांकि मुझे ऐसा करने का कोई धाराप्रवाह एपीआई तरीका नहीं पता है।


1
ज़रूर, मर्ट। फिलहाल मैं माइग्रेशन का उपयोग कर रहा हूं और वहां पर () विधि भी आप डाल सकते हैं: CreateIndex ("dbo.Table1", "Column1", true, "Column1_IX") और नीचे में () "DropIndex (" (dbo.Table1) "," Column1_IX ")। मैं बस उम्मीद कर रहा था कि उन्होंने एक धाराप्रवाह एपीआई भी जोड़ा ...
Valo

1

मैं अतिरिक्त कोड से बचने के लिए धाराप्रवाह ईएफ में उपयोग के लिए एक विस्तार विधि लिखता हूं:

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")));
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.