সত্তা ফ্রেমওয়ার্ক কোড প্রথম অনন্য কলাম


114

আমি সত্ত্বা ফ্রেমওয়ার্ক 4.3 ব্যবহার করছি এবং কোড ফিস্ট ব্যবহার করছি।

আমার একটা ক্লাস আছে

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

আমি কীভাবে সত্তা ফ্রেমওয়ার্ককে বলব যে ডাটাবেস সারণী তৈরি করার সময় ব্যবহারকারী নামটি অনন্য হতে হবে? আমি সম্ভব হলে কনফিগারেশন ফাইলের পরিবর্তে ডেটা অ্যানোটেশনগুলি ব্যবহার করতে পছন্দ করব would

উত্তর:


257

সত্তা ফ্রেমওয়ার্ক 6.1+ এ আপনি আপনার মডেলটিতে এই বৈশিষ্ট্যটি ব্যবহার করতে পারেন:

[Index(IsUnique=true)]

আপনি এই নামস্থানটিতে এটি পেতে পারেন:

using System.ComponentModel.DataAnnotations.Schema;

যদি আপনার মডেল ক্ষেত্রটি একটি স্ট্রিং হয় তবে নিশ্চিত হয়ে নিন যে এটি এসকিউএল সার্ভারে nvarchar (MAX) তে সেট করা নেই বা আপনি প্রথমে সত্ত্বা ফ্রেমওয়ার্ক কোডের মাধ্যমে এই ত্রুটিটি দেখতে পাবেন:

টেবিলের 'dbo.y' কলামে 'x' এমন এক ধরণের যা সূচকে কী কলাম হিসাবে অবৈধ use

এর কারণ হ'ল:

এসকিউএল সার্ভার সমস্ত সূচক কী কলামগুলির সর্বোচ্চ মোট আকারের জন্য 900-বাইট সীমা ধরে রাখে retain

(থেকে: 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

সত্তা ফ্রেমওয়ার্ককোর জন্য এই বিষয়টিও দেখুন: https://github.com/aspnet/EntityFrameworkCore/issues/1698

আপডেট 3

EF6.2 এর জন্য দেখুন: https://github.com/aspnet/EntityFramework6/issues/274

আপডেট 4

EF কোর সহ এএসপি.নেট কোর এমভিসি 2.2:

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

23
কিছু প্রাসঙ্গিক বর্তমান তথ্যের সাথে এই লোকটির পুরাতন পোস্টে জবাব দেওয়ার জন্য ধন্যবাদ!
জিম ইয়ারব্রো

3
কেন একটি সূচক, কেন কেবল বাধা নয়?
জন হেন্কেল

2
: সূচক বনাম contraint প্রশ্ন ... দুটিই MSDN উত্তর দেওয়ার জন্য "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." msdn.microsoft.com/en-us/library/ms187019.aspx
user919426

3
বিঃদ্রঃ; সত্তা ফ্রেমওয়ার্ক কোর ১.০.০-পূর্বরূপ ২-চূড়ান্ততে একটি ডেটা টীকা পদ্ধতি উপলভ্য নয় - ডকস.এফপ্রজেক্ট.এন
এডওয়ার্ড

26

EF কীগুলি ব্যতীত অনন্য কলামগুলি সমর্থন করে না। আপনি যদি EF মাইগ্রেশন ব্যবহার করছেন তবে আপনি EF কে UserNameকলামে অনন্য সূচক তৈরি করতে বাধ্য করতে পারেন (মাইগ্রেশন কোডে, কোনও টিকা দ্বারা নয়) তবে স্বতন্ত্রতা কেবলমাত্র ডাটাবেসে প্রয়োগ করা হবে। যদি আপনি সদৃশ মান সংরক্ষণ করার চেষ্টা করেন তবে আপনাকে ডাটাবেস দ্বারা বহিস্কার হওয়া ব্যতিক্রম (সীমাবদ্ধতা লঙ্ঘন) ধরতে হবে।


1
ঠিক আমি যা খুঁজছিলাম! আমি ভাবছিলাম যে মাইগ্রেশন ব্যবহার করে এই জাতীয় বাধা যুক্ত করা সম্ভব ছিল কিনা?
অ্যালেক্স জর্জনসন

@ লাডিস্লাভ মৃঙ্কা: বীজ পদ্ধতির মাধ্যমেও এটি কি সম্ভব?
রাহিল খান

2
একটি উদাহরণ প্রদান যত্ন? ধন্যবাদ!
জিরো 3

10

আপনার কোড থেকে এটি স্পষ্ট হয়ে যায় যে আপনি পোকো ব্যবহার করেন। অন্য কী থাকা অপ্রয়োজনীয়: আপনি জুফোর পরামর্শ অনুসারে একটি সূচি যুক্ত করতে পারেন ।
আপনি যদি ব্যবহারকারীর নাম বৈশিষ্ট্যটি পরিবর্তনের পরিবর্তে ফ্লুয়েট এপিআই ব্যবহার করেন তবে আপনার কলামের টীকাটি দেখতে দেখতে এইরকম হওয়া উচিত:

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

এটি নিম্নলিখিত এসকিউএল স্ক্রিপ্ট তৈরি করবে:

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 এর পূর্বে সত্ত্বা ফ্রেমওয়ার্কে কলাম টীকা উপলব্ধ নেই।


কনফিগারেশনটি ব্যবহার করে মাল্টিপল কলামগুলি দিয়ে একটি সূচক তৈরি সম্পর্কে কী?
FindOutIslam এখন

একটি ইউজারনেমে আছে, অন্যটি কী?
আলেকজান্ডার ক্রিস্টভ

5

নোট করুন যে সত্তা ফ্রেমওয়ার্ক .1.১-তে (বর্তমানে বিটাতে) সূচক বৈশিষ্ট্যগুলি এনটোট করতে সূচকঅ্যাট্রিবিউটকে সমর্থন করবে যা আপনার কোড ফার্স্ট মাইগ্রেশনগুলিতে স্বয়ংক্রিয়ভাবে কোনও (অনন্য) সূচীতে প্রদর্শিত হবে।


2

EF 6.2 এ ফ্লুয়েন্টিপি ব্যবহার করে আপনি ব্যবহার করতে পারেন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। এই সমাধানটি আপনাকে একটি ভুল ডাটাবেস ডিজাইন দেওয়ার সময় প্রোগ্রামিং সাইডে 'সঠিক' আচরণ দেবে।
অ্যালেক্স জর্জনসন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.