প্রথমে কোড সহ সত্ত্বা ফ্রেমওয়ার্ক .2.২ তে কীভাবে সূচক তৈরি করা যায়


112

নতুন ব্যবহারের পরিবর্তে কোনও কোড / ফার্স্ট ব্যবহার করে কোনও সম্পত্তি / কলামে একটি সূচক তৈরি করার কোনও উপায় আছে কি IndexAttribute?


5
একটি সূচক একটি ডাটাবেস ধারণা, কোনও সত্তা মডেল ধারণা নয়। এমনকি আপনি যদি কোনও বৈশিষ্ট্যযুক্ত বা সাবলীল এপিআইয়ের মাধ্যমে একটি সূচক নির্দিষ্ট করতে পারেন তবে এটি আসলে আপনার আবেদনে কিছু করবে না। ডাটাবেস তৈরি করার সময় এটি কেবল ইএফ ব্যবহার করার জন্য একটি নির্দেশ হতে চাই। আমি বিশ্বাস করি যে এই জাতীয় নির্দেশাবলী কোড-প্রথম মাইগ্রেশনগুলির সাথে সম্পর্কিত, যা সম্পূর্ণভাবে ডেটাবেস স্কিমার সাথে সম্পর্কিত with
জেসি ফোর্ড

উত্তর:


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()


সম্পাদনা # 1

একাধিক কলাম সূচক এবং ক্লাস্টার হিসাবে একটি সূচক চিহ্নিত করার জন্য অতিরিক্ত তথ্যের জন্য একটি উদাহরণ যুক্ত করা হয়েছে Added


সম্পাদনা # 2

অতিরিক্ত তথ্য হিসাবে, EF কোর 2.1 এ এখন EF 6.2 এর মতোই। রেফারেন্স হিসাবে
এখানে এমএস ডক আর্টসিল রয়েছে।


এটা অসাধারণ! আমি অনুমান করি যে আমার কাছে মাল্টিকোলোম সূচক থাকলে এটি এমন কিছু হবে: .হ্যাস ইনডেক্স (পি => নতুন {পি.নাম, পি.জাইজ})
ভালো

ওহ, দুঃখিত, অবশ্যই এটা হওয়া উচিত new। আমি এটা ঠিক করব.
CHW

আপনি দয়া করে দেখাতে পারেন যে আমরা কোর ২.x এ একই কোডটি কীভাবে লিখতে পারি?
ব্যবহারকারী 3417479

আমি যতদূর জানি এটি "কোড" পরে "বহু কলাম সূচী" এর নীচে প্রদর্শিত একই কোড হওয়া উচিত।
CHW

87

সাবলীল এপিআই এর মাধ্যমে সূচী তৈরির জন্য বর্তমানে কোনও "প্রথম শ্রেণির সমর্থন" নেই তবে আপনি যা করতে পারেন তা অনর্গল এপিআইয়ের মাধ্যমে আপনি বৈশিষ্ট্যগুলি এনটেশন এপিআই থেকে বৈশিষ্ট্য হিসাবে চিহ্নিত করতে পারেন। এটি আপনাকে 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()(বা আপনি যদি মাইগ্রেশন ব্যবহার না করে থাকেন তবে স্বয়ংক্রিয়ভাবে ডাটাবেসে তৈরি হবে)।


4
এটি কলামে সূচি যুক্ত করতে পারে তবে এটি প্রাথমিক কীতে তৈরি ক্লাস্টারড সূচকটি সরিয়ে ফেলবে না। হ্যাশকি প্রাথমিক কীগুলিতে ক্লাস্টারড ইনডেক্স তৈরি করে যা ডিফল্টরূপে নয় অপসারণ হয়। এটিকে স্পষ্টভাবে মাইগ্রেশন ফাইল থেকে মুছে ফেলা উচিত ক্লাসার্ড বলে উল্লেখ করে তৈরি করা হয়েছে: .Primarykey(x=>x.id,clustered:false)পদ্ধতিতে মিথ্যা
জয়

8
আমি HasAnnotationপদ্ধতিটি চেষ্টা করেছিলাম এবং এর মতো কোনও পদ্ধতি নেই। তবে আমি একটি পদ্ধতি পেয়েছি যা কোন নাম HasColumnAnnotationযা আপনার সরবরাহ করা পরামিতিগুলি গ্রহণ করে। আপনার উত্তর আপডেট করার দরকার আছে নাকি আমি ভুল?
Hakan Fıstık

@ হ্যাকামফস্টক আমি ইএফ সাইট থেকে সরাসরি উদাহরণটি গ্রহণ করেছি। সম্ভবত সংস্করণগুলির একটিতে নাম পরিবর্তন হয়েছে বা মূল সংস্করণে একটি টাইপ রয়েছে।
স্কট চেম্বারলাইন

3
এই বছরের শুরুর দিকে ডিজাইনের মিটিং থেকে নীচের লিঙ্কটির নীচের অংশটি দেখুন: "হাসকলামএন্টোটেশনে HasAnnotation এর পুনর্নবীকরণ করুন (প্লাস কোড বেসে অন্যান্য প্রাসঙ্গিক স্থান)"। অ্যান্টিফ্রেমওয়ার্ককোডেপ্লেক্স.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 সঙ্গে কাজ করছি।
মিক্স্সিফায়ড

@ মিক্সক্সিফয়েড - আপনি কি দয়া করে সমর্থনকারী বিশদ সহ সমস্যাটি এখানে লগইন করবেন ? এটিও নিশ্চিত হন যে আপনার 1.0.0 সংস্করণ রয়েছে, যেহেতু 1.0.0.0 এ বাগ ছিল ।
ম্যাট জনসন-পিন্ট

আমি সংস্করণ 1.0.1 আছে। আমি ইস্যুটি লগ করব তবে এই মুহুর্তে এটি করতে পারি না।
মিক্স্সিফয়েড

আমি কীভাবে সূচকে অংশগ্রহণকারী কলামের ক্রমকে উত্থানের সাথে যুক্ত করব? ডিফল্ট .HasIndex ( "IX_Customers_EmailAddress", IndexOptions.Unique দ্বারা, ... সূচক তৈরি করে সব অংশগ্রহণকারী কলামের জন্য আরোহী অর্ডার।
GDroid

@ জিড্রয়েড - দুর্ভাগ্যক্রমে, এটি EF এর IndexAttributeবর্গ দ্বারা প্রকাশিত হয়নি , তাই আমি এটিকে আমার লাইব্রেরিতে অন্তর্ভুক্ত করতে পারি না।
ম্যাট জনসন-পিন্ট

24

সুস্পষ্ট নাম ব্যতীত:

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

একটি নির্দিষ্ট নাম সহ:

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

সূচকটি অঙ্কিত হয়েছে বলে মনে হচ্ছে :(
হামেদ জাকারি মিয়াব

1
@ হামেডজ্যাকারিমিয়াব আপনি সত্তা ফ্রেমওয়ার্কের কোন সংস্করণ ব্যবহার করছেন? সূচকটি হ্রাস করা হয়নি।
হুগো হিলরিও

ক্ষমা করবেন, আমি অন্তর্ভুক্ত করা ভুলে গেছি EntityFramework। এটি যে সমাবেশের অন্তর্ভুক্ত। শুধু এনএস সম্পর্কে বিভ্রান্ত।
হামেদ জাকারি মিয়াব 8:25

@ হামেডজ্যাকারিমিয়াব হ্যাঁ যে বিভ্রান্তিকর ছিল! আমি ভেবেছিলাম এটি সিস্টেমের অংশ। ডেটাঅ্যানোটেশন! এটা স্পষ্টভাবে সত্তা ফ্রেমওয়ার্ক প্যাকেজ
AlbatrossCafe

3
প্রশ্নটিতে instead of using the new IndexAttributeআপনি কি এটি লক্ষ্য করেছেন নিচের বিবৃতিটি রয়েছে ?
হাকান ফাস্টিক

22

EF 6.1 থেকে পরবর্তীকালে বৈশিষ্ট্যটি [Index]সমর্থিত। অনন্য সূচকের জন্য
ব্যবহার করুন [Index(IsUnique = true)]মাইক্রোসফ্টের লিঙ্কটি
এখানে

public class User 
{ 
    public int UserId { get; set; } 

    [Index(IsUnique = true)] 
    [StringLength(200)] 
    public string Username { get; set; } 

    public string DisplayName { get; set; } 
}

2
যতক্ষণ এই তাত্ত্বিক প্রশ্নের উত্তর হতে পারে, এটা বাঞ্ছনীয় হবে উত্তর অপরিহার্য অংশের এখানে অন্তর্ভুক্ত করা, এবং রেফারেন্স এর জন্য লিঙ্ক প্রদান।
এনামুল হাসান

পছন্দ করেছেন আমি পরিবর্তনটি প্রতিফলিত করতে একটি কোড স্নিপেট যুক্ত করেছি।
ডারি ডর্লাস

3
স্ট্রিংয়ের দৈর্ঘ্য প্রয়োজন অন্যথায় আপনি দেখতে পাচ্ছেন যে 'একটি প্রকারের এটি একটি সূচকের কী কলাম হিসাবে ব্যবহারের জন্য অবৈধ' ব্যতিক্রম। আমার কলেজটি কানেক্টেক্সটে মডেলবিল্ডার সমাধানটিকে পছন্দ করে যাতে আপনার ব্যবহারকারী শ্রেণিটি গুঁড়িয়ে না দেয় যা আমার ধারণা।
অ্যান্ড্রু পেট

স্বতন্ত্রতার জন্য একাধিক কলাম সহ সূচকগুলি সম্পর্কে কী বলা যায়? একাধিক কলামের অনন্য কী সূচকটি বেশ সাধারণ ...
enorl76

1
@ enorl76 এটি সমর্থিত। প্রতিটি কলামের জন্য আপনাকে নীচের মতো একটি অ্যাট্রিবিউট ব্যবহার করতে হবে, [Index("IX_BlogIdAndRating", 2)] public int Rating { get; set; } [Index("IX_BlogIdAndRating", 1)] public int BlogId { get; set; } এখানে মাইক্রোসফ্ট
ডেরি ডর্লাস

8

সত্তা ফ্রেমওয়ার্ক 6

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

এবং ব্যবহার করে যুক্ত করুন:

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

7

আপনি আইএনডিএক্স ডেটা এনটায়শন কোড প্রথম ডেটা টিকা ব্যবহার করতে পারেন


3
সর্বাধিক কী দৈর্ঘ্য এনভারচচারের জন্য 900 বাইট এবং বার্চারের জন্য 450 বাইট। আপনি যদি কোডটি প্রথমে ব্যবহার করছেন তবে স্ট্রিং বৈশিষ্ট্যগুলি নয়াচারচর হবে এবং আপনার [
স্ট্রিংলংথ

EF 6.1 হিসাবে, এটি সঠিক উত্তর। ডকস.মাইক্রোসফট.এইন
ক্রিস

2

আপনি যদি আপনার পোকোতে বৈশিষ্ট্যগুলি ব্যবহার করতে না চান তবে আপনি সর্বদা এটি নীচের মতো করতে পারেন:

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

আপনি আপনার কাস্টম DbInitializerথেকে প্রাপ্ত ক্লাসে এই বিবৃতিটি কার্যকর করতে পারেন । যদিও আমি এটির কোনও ফ্লুয়েন্ট এপিআই উপায় জানি না।


1
অবশ্যই, Mert। এই মুহুর্তে আমি মাইগ্রেশন ব্যবহার করছি এবং সেখানে আপ () পদ্ধতিতে আপনি এটিও রাখতে পারেন: ক্রিয়েটইন্ডেক্স ("dbo.Table1", "কলাম 1", সত্য, "কলাম 1_IX") এবং ডাউন () ড্রপ ইন্ডেক্সে (("dbo.Table1) "," কলাম 1_আইএক্স ") I আমি কেবল আশা করছিলাম যে তারা একটি সাবলীল এপিআইও যুক্ত করেছে ...
ভালো

1

অতিরিক্ত কোড এড়াতে আমি সাবলীল 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 });

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.