इकाई फ्रेमवर्क कोड पहला अनूठा कॉलम


114

मैं एंटिटी फ्रेमवर्क 4.3 का उपयोग कर रहा हूं और कोड मुट्ठी का उपयोग कर रहा हूं।

मुझे कक्षा में जाना है

public class User
{
   public int UserId{get;set;}
   public string UserName{get;set;}
}

मैं एंटिटी फ्रेमवर्क कैसे बताऊं कि डेटाबेस टेबल बनाते समय यूजरनेम अद्वितीय होना चाहिए? यदि संभव हो तो मैं कॉन्फ़िगरेशन फ़ाइल के बजाय डेटा एनोटेशन का उपयोग करना पसंद करूंगा।

जवाबों:


257

इकाई फ्रेमवर्क में 6.1+ आप अपने मॉडल पर इस विशेषता का उपयोग कर सकते हैं:

[Index(IsUnique=true)]

आप इसे इस नामस्थान में पा सकते हैं:

using System.ComponentModel.DataAnnotations.Schema;

यदि आपका मॉडल फ़ील्ड एक स्ट्रिंग है, तो सुनिश्चित करें कि यह SQL सर्वर में nvarchar (MAX) पर सेट नहीं है या आपको एंटिटी फ्रेमवर्क कोड फर्स्ट के साथ यह त्रुटि दिखाई देगी:

तालिका 'dbo.y' में कॉलम 'x' एक प्रकार का है जो एक इंडेक्स में एक प्रमुख कॉलम के रूप में उपयोग के लिए अमान्य है।

इसका कारण यह है:

SQL सर्वर सभी अनुक्रमणिका कुंजी स्तंभों के अधिकतम कुल आकार के लिए 900-बाइट सीमा रखता है। "

(से: http://msdn.microsoft.com/en-us/library/ms191241.aspx )

आप अपने मॉडल पर अधिकतम स्ट्रिंग लंबाई सेट करके इसे हल कर सकते हैं:

[StringLength(450)]

आपका मॉडल अब EF CF 6.1+ में इस तरह दिखेगा:

public class User
{
   public int UserId{get;set;}
   [StringLength(450)]
   [Index(IsUnique=true)]
   public string UserName{get;set;}
}

अपडेट करें:

यदि आप धाराप्रवाह उपयोग करते हैं:

  public class UserMap : EntityTypeConfiguration<User>
  {
    public UserMap()
    {
      // ....
      Property(x => x.Name).IsRequired().HasMaxLength(450).HasColumnAnnotation("Index", new IndexAnnotation(new[] { new IndexAttribute("Index") { IsUnique = true } }));
    }
  }

और अपने मॉडल में उपयोग करें

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
  // ...
  modelBuilder.Configurations.Add(new UserMap());
  // ...
}

अपडेट २

EntityFrameworkCore के लिए यह विषय भी देखें: https://github.com/aspnet/EntityFrameworkCore/issues/1698

अपडेट ३

EF6.2 के लिए देखें: https://github.com/aspnet/EntityFramework6/issues/274

अद्यतन ४

EF कोर के साथ ASP.NET Core Mvc 2.2:

[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Unique { get; set; }

23
इस आदमी की पुरानी पोस्ट को कुछ प्रासंगिक वर्तमान जानकारी के साथ उत्तर देने के लिए धन्यवाद!
जिम यारबोर

3
सूचकांक क्यों, सिर्फ एक बाधा क्यों नहीं?
जॉन हेंकेल

2
अनुक्रमणिका बनाम "There are no significant differences between creating a UNIQUE constraint and creating a unique index that is independent of a constraint. Data validation occurs in the same manner, and the query optimizer does not differentiate between a unique index created by a constraint or manually created. However, creating a UNIQUE constraint on the column makes the objective of the index clear." गर्भनिरोधक
user919426

3
ध्यान दें; एंटिटी फ्रेमवर्क में कोर 1.0.0-प्रीव्यू 2-फाइनल एक डेटा एनोटेशन विधि उपलब्ध नहीं है - docs.efproject.net/en/latest/modeling/…
एडवर्ड

26

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


1
बिलकुल वही, जिसकी मुझे तलाश थी! मैं सोच रहा था कि क्या प्रवासियों का उपयोग करके ऐसी बाधाओं को जोड़ना संभव है।
एलेक्स जोर्गेनसन

@Ladislav Mrnka: क्या यह बीज पद्धति से भी संभव है?
राहील खान

2
एक उदाहरण प्रदान करने के लिए देखभाल? धन्यवाद!
जीरो 3

10

आपके कोड से यह स्पष्ट हो जाता है कि आप POCO का उपयोग करते हैं। एक और कुंजी होना अनावश्यक है: आप एक सूचकांक जोड़ सकते हैं जैसा कि रसो द्वारा सुझाया गया है
यदि आप उपयोगकर्ता नाम की संपत्ति के बजाय धाराप्रवाह एपीआई का उपयोग करते हैं, तो आपके कॉलम एनोटेशन को इस तरह दिखना चाहिए:

this.Property(p => p.UserName)
    .HasColumnAnnotation("Index", new IndexAnnotation(new[] { 
        new IndexAttribute("Index") { IsUnique = true } 
    }
));

यह निम्न SQL स्क्रिप्ट बनाएगा:

CREATE UNIQUE NONCLUSTERED INDEX [Index] ON [dbo].[Users]
(
    [UserName] ASC
)
WITH (
    PAD_INDEX = OFF, 
    STATISTICS_NORECOMPUTE = OFF, 
    SORT_IN_TEMPDB = OFF, 
    IGNORE_DUP_KEY = OFF, 
    DROP_EXISTING = OFF, 
    ONLINE = OFF, 
    ALLOW_ROW_LOCKS = ON, 
    ALLOW_PAGE_LOCKS = ON
) ON [PRIMARY]

यदि आप एक ही उपयोगकर्ता नाम वाले कई उपयोगकर्ताओं को सम्मिलित करने का प्रयास करते हैं, तो आपको निम्न संदेश के साथ DbUpdateException मिलेगी:

Cannot insert duplicate key row in object 'dbo.Users' with unique index 'Index'. 
The duplicate key value is (...).
The statement has been terminated.

संस्करण 6.1 से पहले एंटिटी फ्रेमवर्क में फिर से कॉलम एनोटेशन उपलब्ध नहीं हैं।


क्या विन्यास का उपयोग करके उत्परिवर्ती कॉलम के साथ एक सूचकांक बनाने के बारे में?
FindOutIslamNow

एक यूजरनेम पर है, दूसरा क्या है?
अलेक्जेंडर क्रिस्टोव

5

ध्यान दें कि एंटिटी फ्रेमवर्क में 6.1 (वर्तमान में बीटा में) इंडेक्स एट्रिब्यूट को इंडेक्स प्रॉपर्टीज को एनोटेट करने के लिए सपोर्ट करेगा, जो आपके कोड फर्स्ट माइग्रेशन में स्वचालित रूप से (यूनिक) इंडेक्स का परिणाम देगा।


2

EF 6.2 में FluentAPI का उपयोग करके , आप उपयोग कर सकते हैंHasIndex()

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

-13

EF4.3 के लिए समाधान

अद्वितीय उपयोगकर्ता नाम

कॉलम के ऊपर डेटा एनोटेशन जोड़ें:

 [Index(IsUnique = true)]
 [MaxLength(255)] // for code-first implementations
 public string UserName{get;set;}

विशिष्ट आईडी , मैंने अपने कॉलम में सजावट और कुंजी जोड़ दी है और किया है। समान समाधान यहां वर्णित है: https://msdn.microsoft.com/en-gb/data/jj591583.aspx

अर्थात:

[Key]
public int UserId{get;set;}

वैकल्पिक उत्तर

डेटा एनोटेशन का उपयोग करना

[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[Column("UserId")]

मैपिंग का उपयोग करना

  mb.Entity<User>()
            .HasKey(i => i.UserId);
        mb.User<User>()
          .Property(i => i.UserId)
          .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity)
          .HasColumnName("UserId");

25
इस उपाय से सावधान रहें। प्रॉपर्टी में Keyविशेषता जोड़ने से UserNameप्रॉपर्टी UserNameडेटाबेस में प्राथमिक कुंजी बन जाएगी । केवल UserIdसंपत्ति को Keyविशेषता के साथ चिह्नित किया जाना चाहिए । यह समाधान आपको गलत डेटाबेस डिज़ाइन देते समय प्रोग्रामिंग साइड पर 'सही' व्यवहार देगा।
एलेक्स जोर्गेनसन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.