নতুন ব্যবহারের পরিবর্তে কোনও কোড / ফার্স্ট ব্যবহার করে কোনও সম্পত্তি / কলামে একটি সূচক তৈরি করার কোনও উপায় আছে কি 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()
।
সম্পাদনা # 1
একাধিক কলাম সূচক এবং ক্লাস্টার হিসাবে একটি সূচক চিহ্নিত করার জন্য অতিরিক্ত তথ্যের জন্য একটি উদাহরণ যুক্ত করা হয়েছে Added
সম্পাদনা # 2
অতিরিক্ত তথ্য হিসাবে, EF কোর 2.1 এ এখন EF 6.2 এর মতোই। রেফারেন্স হিসাবে
এখানে এমএস ডক আর্টসিল রয়েছে।
new
। আমি এটা ঠিক করব.
সাবলীল এপিআই এর মাধ্যমে সূচী তৈরির জন্য বর্তমানে কোনও "প্রথম শ্রেণির সমর্থন" নেই তবে আপনি যা করতে পারেন তা অনর্গল এপিআইয়ের মাধ্যমে আপনি বৈশিষ্ট্যগুলি এনটেশন এপিআই থেকে বৈশিষ্ট্য হিসাবে চিহ্নিত করতে পারেন। এটি আপনাকে 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()
(বা আপনি যদি মাইগ্রেশন ব্যবহার না করে থাকেন তবে স্বয়ংক্রিয়ভাবে ডাটাবেসে তৈরি হবে)।
.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)]
। মাইক্রোসফ্টের লিঙ্কটি
এখানে
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; }
এখানে মাইক্রোসফ্ট
সত্তা ফ্রেমওয়ার্ক 6
Property(c => c.MyColumn)
.HasColumnAnnotation("Index", new IndexAnnotation(new IndexAttribute("IX_MyIndex")));
এবং ব্যবহার করে যুক্ত করুন:
using System.Data.Entity.Infrastructure.Annotations;
using System.ComponentModel.DataAnnotations.Schema;
আপনি আইএনডিএক্স ডেটা এনটায়শন কোড প্রথম ডেটা টিকা ব্যবহার করতে পারেন
আপনি যদি আপনার পোকোতে বৈশিষ্ট্যগুলি ব্যবহার করতে না চান তবে আপনি সর্বদা এটি নীচের মতো করতে পারেন:
context.Database.ExecuteSqlCommand("CREATE INDEX IX_NAME ON ...");
আপনি আপনার কাস্টম DbInitializer
থেকে প্রাপ্ত ক্লাসে এই বিবৃতিটি কার্যকর করতে পারেন । যদিও আমি এটির কোনও ফ্লুয়েন্ট এপিআই উপায় জানি না।
অতিরিক্ত কোড এড়াতে আমি সাবলীল 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 });
আপনি এর একটি ব্যবহার করতে পারেন
// সূচী
this.HasIndex(e => e.IsActive)
.HasName("IX_IsActive");
অথবা
this.Property(e => e.IsActive).HasColumnAnnotation(
"Index",
new IndexAnnotation(new IndexAttribute("IX_IsActive")));