অনর্গল এপিআই দিয়ে অনন্য প্রতিবন্ধকতা সেট করছেন?


185

আমি কোড ফার্স্ট এবং একটি EntityTypeConfigurationব্যবহার সাবলীল এপিআই দিয়ে একটি EF সত্তা তৈরির চেষ্টা করছি । প্রাথমিক কী তৈরি করা সহজ তবে কোনও অনন্য বাধা দিয়ে নয়। আমি পুরানো পোস্টগুলি দেখছিলাম যা এর জন্য নেটিভ এসকিউএল কমান্ডগুলি কার্যকর করার পরামর্শ দিয়েছিল তবে এটি উদ্দেশ্যটিকে পরাস্ত করে বলে মনে হচ্ছে। EF6 এর মাধ্যমে কি এটি সম্ভব?

উত্তর:


275

উপর EF6.2 , আপনি ব্যবহার করতে পারেন HasIndex()অনর্গল API এর মাধ্যমে মাইগ্রেশন জন্য ইনডেক্স যোগ করতে।

https://github.com/aspnet/EntityFramework6/issues/274

উদাহরণ

modelBuilder
    .Entity<User>()
    .HasIndex(u => u.Email)
        .IsUnique();

উপর EF6.1 অগ্রে, আপনি ব্যবহার করতে পারেন IndexAnnotation()আপনার অনর্গল API এ স্থানান্তরের জন্য ইনডেক্স যোগ করতে।

http://msdn.microsoft.com/en-us/data/jj591617.aspx#PropertyIndex

আপনাকে অবশ্যই রেফারেন্স যুক্ত করতে হবে:

using System.Data.Entity.Infrastructure.Annotations;

বেসিক উদাহরণ

User.FirstNameসম্পত্তিটিতে একটি সূচক যুক্ত করে এখানে একটি সাধারণ ব্যবহার

modelBuilder 
    .Entity<User>() 
    .Property(t => t.FirstName) 
    .HasColumnAnnotation(IndexAnnotation.AnnotationName, new IndexAnnotation(new IndexAttribute()));

ব্যবহারিক উদাহরণ:

এখানে আরও বাস্তব উদাহরণ। এটি একাধিক বৈশিষ্ট্যে অনন্য সূচক যুক্ত করে: User.FirstNameএবং User.LastName, "IX_FirstNameLastName" এর একটি সূচীর নাম সহ

modelBuilder 
    .Entity<User>() 
    .Property(t => t.FirstName) 
    .IsRequired()
    .HasMaxLength(60)
    .HasColumnAnnotation(
        IndexAnnotation.AnnotationName, 
        new IndexAnnotation(
            new IndexAttribute("IX_FirstNameLastName", 1) { IsUnique = true }));

modelBuilder 
    .Entity<User>() 
    .Property(t => t.LastName) 
    .IsRequired()
    .HasMaxLength(60)
    .HasColumnAnnotation(
        IndexAnnotation.AnnotationName, 
        new IndexAnnotation(
            new IndexAttribute("IX_FirstNameLastName", 2) { IsUnique = true }));

4
এটি কলাম টীকাটি "সূচক" হিসাবে নামকরণ করা প্রয়োজন! আমি আরেকটি নাম লিখেছিলাম এবং এটি কার্যকর হয়নি! আমি আপনার পোস্টের মতো এটির মূল "সূচক" নামকরণ করার চেষ্টা করার কয়েক ঘন্টা আগে ব্যয় করেছি এবং বুঝতে পেরেছি যে এটি গুরুত্বপূর্ণ। :( আছে না হার্ড কোডে কাঠামোর মধ্যে এটির জন্য একটি ধ্রুবক স্ট্রিং হতে হবে।
আলেকজান্ডার Vasilyev

10
@ আলেকজান্ডার ভ্যাসিলিভ ধ্রুবকটির সংজ্ঞা দেওয়া হয়েছেIndexAnnotation.AnnotationName
নাথান

3
@ নাথান আপনাকে ধন্যবাদ! এটাই! এই ধ্রুবকটি ব্যবহার করে এই পোস্টের উদাহরণটি সংশোধন করতে হবে।
আলেকজান্ডার ভ্যাসিলিভ


2
আমি বিশ্বাস করি যে প্রথম উদাহরণে ইনডেক্স অ্যাট্রিবিউট তৈরি করার সময় ইসুনিককে সত্যে সেট করা দরকার। ভালো: new IndexAttribute() { IsUnique = true }। অন্যথায় এটি কেবল নিয়মিত (অ-অনন্য) সূচক তৈরি করে।
জাকুবকা

134

ইওরো এর উত্তরের যোগ হিসাবে এটি গুণাবলী ব্যবহার করেও করা যেতে পারে।

intটাইপ অনন্য কী সংমিশ্রনের জন্য নমুনা :

[Index("IX_UniqueKeyInt", IsUnique = true, Order = 1)]
public int UniqueKeyIntPart1 { get; set; }

[Index("IX_UniqueKeyInt", IsUnique = true, Order = 2)]
public int UniqueKeyIntPart2 { get; set; }

যদি ডেটা টাইপ হয় string, তবে MaxLengthগুণাবলী অবশ্যই যুক্ত করা উচিত:

[Index("IX_UniqueKeyString", IsUnique = true, Order = 1)]
[MaxLength(50)]
public string UniqueKeyStringPart1 { get; set; }

[Index("IX_UniqueKeyString", IsUnique = true, Order = 2)]
[MaxLength(50)]
public string UniqueKeyStringPart2 { get; set; }

যদি কোনও ডোমেন / স্টোরেজ মডেল পৃথকীকরণের উদ্বেগ থাকে তবে Metadatatypeঅ্যাট্রিবিউট / শ্রেণি ব্যবহার করা একটি বিকল্প হতে পারে: https://msdn.microsoft.com/en-us/library/ff664465%28v=pandp.50%29.aspx?f= 255 & MSPPError = -2147217396


একটি দ্রুত কনসোল অ্যাপ্লিকেশন উদাহরণ:

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

namespace EFIndexTest
{
    class Program
    {
        static void Main(string[] args)
        {
            using (var context = new AppDbContext())
            {
                var newUser = new User { UniqueKeyIntPart1 = 1, UniqueKeyIntPart2 = 1, UniqueKeyStringPart1 = "A", UniqueKeyStringPart2 = "A" };
                context.UserSet.Add(newUser);
                context.SaveChanges();
            }
        }
    }

    [MetadataType(typeof(UserMetadata))]
    public class User
    {
        public int Id { get; set; }
        public int UniqueKeyIntPart1 { get; set; }
        public int UniqueKeyIntPart2 { get; set; }
        public string UniqueKeyStringPart1 { get; set; }
        public string UniqueKeyStringPart2 { get; set; }
    }

    public class UserMetadata
    {
        [Index("IX_UniqueKeyInt", IsUnique = true, Order = 1)]
        public int UniqueKeyIntPart1 { get; set; }

        [Index("IX_UniqueKeyInt", IsUnique = true, Order = 2)]
        public int UniqueKeyIntPart2 { get; set; }

        [Index("IX_UniqueKeyString", IsUnique = true, Order = 1)]
        [MaxLength(50)]
        public string UniqueKeyStringPart1 { get; set; }

        [Index("IX_UniqueKeyString", IsUnique = true, Order = 2)]
        [MaxLength(50)]
        public string UniqueKeyStringPart2 { get; set; }
    }

    public class AppDbContext : DbContext
    {
        public virtual DbSet<User> UserSet { get; set; }
    }
}

45
আপনি যদি আপনার ডোমেন মডেলটিকে স্টোরেজ উদ্বেগ থেকে সম্পূর্ণ আলাদা রাখতে চান তবে তা নয়।
রিকার্ড লিলজেবার্গ

4
আপনাকে অবশ্যই নিশ্চিত করতে হবে যে আপনার সত্তা ফ্রেমওয়ার্কের একটি রেফারেন্স রয়েছে
মাইকেল ট্রানকিডা

2
সূচক বৈশিষ্ট্যটি সত্তা ফ্রেমওয়ার্ক থেকে আলাদা করা থাকলে আমি এটিকে আমার মডেল প্রকল্পে অন্তর্ভুক্ত করতে পারি nice আমি বুঝতে পারি যে এটি স্টোরেজ উদ্বেগ, তবে আমি এটি ব্যবহার করার প্রধান কারণটি ইউজারনেম এবং ভূমিকা নামগুলির মতো জিনিসে অনন্য প্রতিবন্ধকতা স্থাপন করা।
স্যাম


4
এটি কেবল তখনই কাজ করে যদি আপনি স্ট্রিংয়ের দৈর্ঘ্যও সীমাবদ্ধ করেন, কেননা এসকিউএল এনভারচচার (সর্বাধিক) কে কী হিসাবে ব্যবহার করার অনুমতি দেয় না ।
জেএমকে

17

আরও অনর্গলভাবে অনন্য সূচি নির্ধারণের জন্য এখানে একটি এক্সটেনশন পদ্ধতি রয়েছে:

public static class MappingExtensions
{
    public static PrimitivePropertyConfiguration IsUnique(this PrimitivePropertyConfiguration configuration)
    {
        return configuration.HasColumnAnnotation("Index", new IndexAnnotation(new IndexAttribute { IsUnique = true }));
    }
}

ব্যবহার:

modelBuilder 
    .Entity<Person>() 
    .Property(t => t.Name)
    .IsUnique();

মাইগ্রেশন তৈরি করবে যেমন:

public partial class Add_unique_index : DbMigration
{
    public override void Up()
    {
        CreateIndex("dbo.Person", "Name", unique: true);
    }

    public override void Down()
    {
        DropIndex("dbo.Person", new[] { "Name" });
    }
}

এসসিআর: সত্তা ফ্রেমওয়ার্ক 6.1 সাবলীল এপিআই সহ অনন্য সূচক তৈরি করা


16

@ coni2k এর উত্তর সঠিক তবে তবে [StringLength]এটির কাজ করার জন্য আপনাকে অবশ্যই গুন যুক্ত করতে হবে অন্যথায় আপনি একটি অবৈধ কী ব্যতিক্রম পাবেন (উদাহরণস্বরূপ বেলো)।

[StringLength(65)]
[Index("IX_FirstNameLastName", 1, IsUnique = true)]
public string FirstName { get; set; }

[StringLength(65)]
[Index("IX_FirstNameLastName", 2, IsUnique = true)]
public string LastName { get; set; }


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