एंटिटी फ्रेमवर्क कोर अद्वितीय अवरोध कोड-प्रथम जोड़ता है


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",

अनुक्रमणिका के लिए धाराप्रवाह एपीआई के नमूने पर देख learnentityframeworkcore.com/configuration/fluent-api/...
माइकल Freidgeim

जवाबों:


301

ईएफ कोर पर आप डेटा एनोटेशन का उपयोग करके इंडेक्स नहीं बना सकते हैं। लेकिन आप इसे धाराप्रवाह एपीआई का उपयोग करके कर सकते हैं।

इस तरह अपने अंदर {Db}Context.cs:

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

... या यदि आप buildAction के साथ अधिभार का उपयोग कर रहे हैं:

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

आप इसके बारे में और अधिक यहाँ पढ़ सकते हैं: अनुक्रमणिका


1
आपकी मदद के लिए बहुत बहुत धन्यवाद, यह सही समाधान है!
वादिम एम

यदि कोई व्यक्ति ऐसी भूमि की तलाश कर रहा है, जो एमएस आइडेंटिटी स्कीमा का उपयोग करते समय काम करती है, तो मैं सुझाव देता हूं कि नॉर्मलाइज्ड ई-मेल फ़ील्ड पर विशिष्ट अवरोध स्थापित करें, ईमेल (एस्पेक्टर्स यूनिट) नहीं। अलग-अलग मामले का उपयोग करते हुए बाधा का उल्लंघन करने में विफल हो सकता है, भले ही वह एक ही ईमेल पता हो, जो db की समतलीकरण सेटिंग पर निर्भर करता है।
टॉम

4
यह कोड टाइप स्ट्रिंग के कॉलम के लिए काम नहीं कर रहा है :( क्या स्ट्रिंग कॉलम पर अद्वितीय अवरोध जोड़ने का कोई तरीका है?
जोहर ज़मान

गोHasAlternateKey
चमिका संदलम

1
मैंने यह कोशिश की जब मैं इस पर काम कर रहा था लेकिन अब मुझे इसे लागू करने की आवश्यकता नहीं है। Btw आपकी टिप्पणी के लिए धन्यवाद। @ संपत
जौहर

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

DB तालिका इस तरह दिखाई देगी:

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

ईएफ कोर डॉक्स का संदर्भ दें


11
EF Core डॉक्स के अनुसार: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.
bigworld12

बिगवर्ल्ड 12 की टिप्पणी का संदर्भ: 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; }
}

[UniqueKey] विशेषता Microsoft द्वारा परिभाषित विशेषता है? या इसे स्वयं परिभाषित करना चाहिए?
मोहम्मद उस्मान

[UniqueKey] विशेषता एक कस्टम विशेषता है जिसे मैंने .cs इकाई वर्गों (और DbContext के OnModelCreating () विधि) के माध्यम से अद्वितीय कुंजियों को जोड़ने में सक्षम करने के लिए विकसित किया है
जस्टिन ट्यूब्स

3
एक दम बढ़िया। क्या आप कृपया अपने द्वारा विकसित कस्टम विशेषता का कोड डाल सकते हैं ?!
मोहम्मद उस्मान


2

किसी के लिए जो इन सभी समाधानों की कोशिश कर रहा है लेकिन काम करने की कोशिश नहीं कर रहा है, इसने मेरे लिए काम किया

protected override void OnModelCreating(ModelBuilder builder)
{

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

}

2

मॉडल विन्यास के माध्यम से ईएफ कोर में इसका उपयोग करने के लिए

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

1

इन तरीकों में से किसी ने मेरे लिए .NET कोर 2.2 में काम नहीं किया, लेकिन मैं इस उद्देश्य के लिए काम करने के लिए एक अलग प्राथमिक कुंजी को परिभाषित करने के लिए मेरे पास कुछ कोड को अनुकूलित करने में सक्षम था।

नीचे दिए गए उदाहरण में मैं यह सुनिश्चित करना चाहता हूं कि आउटलेट क्षेत्र अद्वितीय है:

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

    }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.