धाराप्रवाह एपीआई के साथ अद्वितीय बाधा की स्थापना?


185

मैं कोड पहले, और एक EntityTypeConfigurationधाराप्रवाह एपीआई का उपयोग करके ईएफ इकाई बनाने की कोशिश कर रहा हूं । प्राथमिक कुंजी बनाना आसान है, लेकिन एक अद्वितीय बाधा के साथ ऐसा नहीं है। मैं पुरानी पोस्ट देख रहा था जिसने इसके लिए देशी एसक्यूएल कमांड को निष्पादित करने का सुझाव दिया था, लेकिन यह उद्देश्य को हराने के लिए प्रतीत होता है। क्या यह EF6 के साथ संभव है?

जवाबों:


275

पर EF6.2 , तो आप उपयोग कर सकते हैं HasIndex()धाराप्रवाह एपीआई के माध्यम से प्रवास के लिए अनुक्रमित जोड़ने के लिए।

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

उदाहरण

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

EF6.1 पर , आप IndexAnnotation()अपने धाराप्रवाह एपीआई में प्रवास के लिए अनुक्रमित जोड़ने के लिए उपयोग कर सकते हैं ।

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
कॉलम एनोटेशन को "इंडेक्स" नाम देना आवश्यक है! मैंने दूसरा नाम लिखा और यह काम नहीं किया! अपनी पोस्ट में मूल "अनुक्रमणिका" का नाम बदलने की कोशिश करने से पहले मैंने घंटों बिताए और समझा कि यह महत्वपूर्ण है। :( इसके लिए एक स्थिरांक होना चाहिए, जिसमें कड़े कोड को नहीं होना चाहिए।
अलेक्जेंडर वसीलीव

10
@AlexanderVasilyev निरंतर रूप में परिभाषित किया गया हैIndexAnnotation.AnnotationName
नाथन

3
@ नथन थैंक यू! बस! इस पोस्ट में उदाहरण को इस स्थिरांक का उपयोग करके ठीक किया जाना चाहिए।
अलेक्जेंडर वसीलीव

2
इसे EF7 - DNX
Shimmy Weitzhandler

2
मेरा मानना ​​है कि पहले उदाहरण में IndexAttribute बनाते समय IsUnique को सही पर सेट करने की आवश्यकता है। इस तरह 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 = -+२१४७२१७३९६


एक त्वरित कंसोल ऐप उदाहरण:

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
आपको यह भी सुनिश्चित करने की आवश्यकता है कि आपके पास EntityFramework
Michael Tranchida

2
अच्छा हो अगर इंडेक्स विशेषता को एंटिटी फ्रेमवर्क से अलग किया गया था, तो मैं इसे अपने मॉडल प्रोजेक्ट में शामिल कर सकता हूं। मैं समझता हूं कि यह एक भंडारण चिंता का विषय है, लेकिन इसका मुख्य कारण मैं इसका उपयोग उपयोगकर्ता नाम और भूमिका नाम जैसी चीजों पर अद्वितीय अवरोधों के लिए करता हूं।
सैम

2
इसे EF7 - DNX
Shimmy Weitzhandler

4
यह केवल तभी काम करता है जब आप स्ट्रिंग की लंबाई को भी सीमित करते हैं, क्योंकि SQL नवरच (अधिकतम) को कुंजी के रूप में उपयोग करने की अनुमति नहीं देता है ।
JMK

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

Src: Entity Framework 6.1 धाराप्रवाह एपीआई के साथ अनोखा सूचकांक बनाना


16

@ coni2k का उत्तर सही है, हालांकि आपको [StringLength]इसे काम करने के लिए विशेषता जोड़ना होगा अन्यथा आपको एक अमान्य कुंजी अपवाद (उदाहरण bellow) मिलेगा।

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


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