data annotations इकाई फ्रेमवर्क कोड पहला अद्वितीय कॉलम




data-annotations entity-framework-4.3 (4)

मैं इकाई फ्रेमवर्क 4.3 और कोड फिस्ट का उपयोग कर रहा हूं।

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

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

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


इकाई फ्रेमवर्क 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)]

आपका मॉडल अब इस तरह ईएफ सीएफ 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());
  // ...
}

अद्यतन 2

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

अद्यतन 3

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


ईएफ 4.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");

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


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

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 से पहले इकाई फ्रेमवर्क में कॉलम एनोटेशन उपलब्ध नहीं हैं।





entity-framework-4.3