সত্তা ফ্রেমওয়ার্ক কোর প্রথমে অনন্য সীমাবদ্ধতা যুক্ত করে


152

বৈশিষ্ট্যটি ব্যবহার করে আমি আমার ক্ষেত্রে একটি অনন্য বাধা যুক্ত করার উপায় খুঁজে পাচ্ছি না:

public class User
{
    [Required]
    public int Id { get; set; }

    [Required]
    // [Index("IX_FirstAndSecond", 2, IsUnique = true)] not supported by core
    public string Email { get; set; }

    [Required]
    public string Password { get; set; }
}

আমি এই প্যাকেজগুলি ব্যবহার করছি:

 "Microsoft.EntityFrameworkCore": "1.0.1",
 "Microsoft.EntityFrameworkCore.SqlServer": "1.0.1",
 "Microsoft.EntityFrameworkCore.SqlServer.Design": "1.0.1",
 "Microsoft.EntityFrameworkCore.Tools": "1.0.0-preview2-final",

সূচকের জন্য সাবলীল এপি-র নমুনাগুলি শিখুন ফ্রেমওয়ার্ককোর্ড
মাইকেল ফ্রেইজিম

উত্তর:


301

ইএফ কোরে আপনি ডেটা টীকাগুলি ব্যবহার করে সূচী তৈরি করতে পারবেন না ut তবে আপনি এটি সাবলীল এপিআই ব্যবহার করে করতে পারেন।

এটি আপনার ভিতরে পছন্দ করুন {Db}Context.cs:

protected override void OnModelCreating(ModelBuilder builder)
{
    builder.Entity<User>()
        .HasIndex(u => u.Email)
        .IsUnique();
}

... বা যদি আপনি বিল্ডএকশন দিয়ে ওভারলোডটি ব্যবহার করছেন:

protected override void OnModelCreating(ModelBuilder builder)
{
    builder.Entity<User>(entity => {
        entity.HasIndex(e => e.Email).IsUnique();
    });
}

আপনি এটি সম্পর্কে এখানে আরও পড়তে পারেন: সূচি


1
আপনার সাহায্যের জন্য আপনাকে অনেক ধন্যবাদ, এটি সঠিক সমাধান!
ভাদিম এম

এমএস আইডেন্টিটি স্কিমা ব্যবহার করার সময় যদি কেউ সমাধানের জন্য কাজ করে এমন ক্ষেত্রে সেক্ষেত্রে আমি নর্মালাইজড ইমেল ক্ষেত্রে অনন্য সীমাবদ্ধতা সেট করার পরামর্শ দিই, ইমেল নয় (অ্যাস্পনেট ব্যবহারকারীদের সত্তার)। বিভিন্ন কেস ব্যবহার করা সীমাবদ্ধতা লঙ্ঘন করতে ব্যর্থ হতে পারে যদিও এটি একই ইমেল ঠিকানা, ডিবি-র কোলেশন সেটিংয়ের উপর নির্ভর করে।
টম

4
এই কোডটি স্ট্রিংয়ের কলামের জন্য কাজ করছে না :( স্ট্রিং কলামে অনন্য বাধা যুক্ত করার কোনও উপায় আছে?
জোহর জামান


1
আমি এটি কাজ করার সময় আমি এটি চেষ্টা করেছিলাম কিন্তু এখন আমার এটি প্রয়োগ করার দরকার নেই। বিটিডব্লু আপনার মন্তব্যের জন্য আপনাকে ধন্যবাদ। @ সম্পথ
জোহর জামান

70

এছাড়াও আপনি যদি একাধিক কলামগুলিতে অনন্য প্রতিবন্ধকতা তৈরি করতে চান তবে আপনি এটি সহজভাবে করতে পারেন (@ সম্পথের লিঙ্কটি অনুসরণ করে )

class MyContext : DbContext
{
    public DbSet<Person> People { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Person>()
            .HasIndex(p => new { p.FirstName, p.LastName })
            .IsUnique(true);
    }
}

public class Person
{
    public int PersonId { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

9

ইএফ কোর জন্য সমাধান

public class User
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Passport { get; set; }
}

public class ApplicationContext : DbContext
{
    public DbSet<User> Users { get; set; }
    public ApplicationContext()
    {
        Database.EnsureCreated();
    }
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=efbasicsappdb;Trusted_Connection=True;");
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<User>().HasAlternateKey(u => u.Passport);
        //or: modelBuilder.Entity<User>().HasAlternateKey(u => new { u.Passport, u.Name})
    }
}

ডিবি টেবিলটি দেখতে এমন হবে:

CREATE TABLE [dbo].[Users] (
    [Id]       INT            IDENTITY (1, 1) NOT NULL,
    [Name]     NVARCHAR (MAX) NULL,
    [Passport] NVARCHAR (450) NOT NULL,
    CONSTRAINT [PK_Users] PRIMARY KEY CLUSTERED ([Id] ASC),
    CONSTRAINT [AK_Users_Passport] UNIQUE NONCLUSTERED ([Passport] ASC)
);

EF কোর ডক্সে রেফারেন্স দিন


11
ইএফ কোর ডক্স অনুসারে:If you just want to enforce uniqueness of a column then you want a unique index rather than an alternate key. In EF, alternate keys provide greater functionality than unique indexes because they can be used as the target of a foreign key.
বিগ ওয়ার্ল্ড 12

Bigworld12 এর মন্তব্যের রেফারেন্স: docs.microsoft.com/en-us/ef/core/modeling/...
granadaCoder

3

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

public class Company
{
    [Required]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid CompanyId { get; set; }

    [Required]
    [UniqueKey(groupId: "1", order: 0)]
    [StringLength(100, MinimumLength = 1)]
    public string CompanyName { get; set; }

    [Required]
    [UniqueKey(groupId: "1", order: 1)]
    [StringLength(100, MinimumLength = 1)]
    public string CompanyLocation { get; set; }
}

[ইউনিককি] অ্যাট্রিবিউটটি কি মাইক্রোসফ্ট দ্বারা নির্ধারিত বৈশিষ্ট্য? বা একটি নিজেকে এটি সংজ্ঞায়িত করা উচিত?
মোহাম্মদ ওসমান

[ইউনিককি] অ্যাট্রিবিউটটি একটি কাস্টম অ্যাট্রিবিউট যা আমি .cs সত্তা শ্রেণীর মধ্যে অনন্য কী সংযোজন সক্ষম করার জন্য বিকাশ করেছি (এবং ডিবি কনটেক্সট-এর অনমোডেল ক্রিয়েটিং () পদ্ধতির মাধ্যমে নয়)
জাস্টিন টিউবস

3
দারুণ. আপনি দয়া করে আপনার বিকাশিত কাস্টম বৈশিষ্ট্যের কোডটি রাখতে পারেন ?!
মোহাম্মদ ওসমান


2

যে কেউ এই সমস্ত সমাধানের চেষ্টা করছেন তবে এটি চেষ্টা করে না, এটি আমার পক্ষে কাজ করেছে worked

protected override void OnModelCreating(ModelBuilder builder)
{

    builder.Entity<User>().Property(t => t.Email).HasColumnAnnotation("Index", new IndexAnnotation(new IndexAttribute("IX_EmailIndex") { IsUnique = true }));

}

2

এটি মডেল কনফিগারেশনের মাধ্যমে EF কোর এ ব্যবহার করতে

public class ApplicationCompanyConfiguration : IEntityTypeConfiguration<Company>
{
    public void Configure(EntityTypeBuilder<Company> builder)
    {
        builder.ToTable("Company"); 
        builder.HasIndex(p => p.Name).IsUnique();
    }
}

1

নেট কোর ২.২ এ এই পদ্ধতির কোনওটিই আমার পক্ষে কাজ করে নি তবে এই উদ্দেশ্যে কাজ করার জন্য একটি পৃথক প্রাথমিক কী সংজ্ঞায়িত করার জন্য আমার কিছু কোড মানিয়ে নিতে সক্ষম হয়েছিল।

নীচের উদাহরণে আমি নিশ্চিত করতে চাই যে আউটলেটআরফ ক্ষেত্রটি অনন্য:

public class ApplicationDbContext : IdentityDbContext
    {
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
            modelBuilder.Entity<Outlet>()
                .HasIndex(o => new { o.OutletRef });
        }
    }

এটি ডাটাবেসে প্রয়োজনীয় অনন্য সূচক যুক্ত করে। এটি যা না করে তা হ'ল একটি কাস্টম ত্রুটি বার্তা নির্দিষ্ট করার ক্ষমতা সরবরাহ করে।


0

সাবলীল এপিআই ব্যবহার করে আমরা স্বতন্ত্র কী সূচক যুক্ত করতে পারি। নীচের কোডটি আমার জন্য কাজ করেছিল

protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {

        modelBuilder.Entity<User>().Property(p => p.Email).HasColumnAnnotation("Index", new IndexAnnotation(new IndexAttribute("IX_EmailIndex") { IsUnique = true }));

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