खोज…


टिप्पणियों

Entity Framework Code-First, DataAnnotation विशेषताओं का एक सेट प्रदान करता है, जिसे आप अपने डोमेन वर्गों और गुणों पर लागू कर सकते हैं। DataAnnotation विशेषताएँ डिफ़ॉल्ट कोड-प्रथम सम्मेलनों को ओवरराइड करती हैं।

  1. System.ComponentModel.DataAnnotations में उन विशेषताओं को शामिल किया गया है जो स्तंभ की अशक्तता या आकार पर प्रभाव डालती हैं।
  2. System.ComponentModel.DataAnnotations.Schema नाम स्थान में डेटाबेस के स्कीमा को प्रभावित करने वाले गुण शामिल हैं।

नोट: DataAnnotations केवल आपको कॉन्फ़िगरेशन विकल्पों का एक सबसेट देता है। धाराप्रवाह एपीआई कोड-प्रथम में उपलब्ध कॉन्फ़िगरेशन विकल्पों का एक पूरा सेट प्रदान करता है।

[कुंजी] विशेषता

कुंजी एक तालिका में एक क्षेत्र है जो विशिष्ट रूप से डेटाबेस तालिका में प्रत्येक पंक्ति / रिकॉर्ड की पहचान करता है।

डिफ़ॉल्ट कोड-प्रथम सम्मेलन को ओवरराइड करने के लिए इस विशेषता का उपयोग करें। यदि किसी संपत्ति पर लागू किया जाता है, तो इसे इस वर्ग के लिए प्राथमिक कुंजी स्तंभ के रूप में उपयोग किया जाएगा।

using System.ComponentModel.DataAnnotations;

public class Person
{
    [Key]
    public int PersonKey { get; set; }        // <- will be used as primary key
     
    public string PersonName { get; set; }    
}

यदि एक समग्र प्राथमिक कुंजी की आवश्यकता होती है, तो [कुंजी] विशेषता को कई गुणों में भी जोड़ा जा सकता है। समग्र कुंजी के भीतर स्तंभों का क्रम प्रपत्र [ कुंजी, कॉलम (आदेश = x)] में प्रदान किया जाना चाहिए।

using System.ComponentModel.DataAnnotations;

public class Person
{
    [Key, Column(Order = 0)]
    public int PersonKey1 { get; set; }    // <- will be used as part of the primary key

    [Key, Column(Order = 1)]
    public int PersonKey2 { get; set; }    // <- will be used as part of the primary key
     
    public string PersonName { get; set; }    
}

[कुंजी] विशेषता के बिना , EntityFramework डिफ़ॉल्ट सम्मेलन में वापस आ जाएगा जो कि कक्षा की संपत्ति को प्राथमिक कुंजी के रूप में उपयोग करना है जिसे "Id" या "{ClassName} Id" नाम दिया गया है।

public class Person
{
    public int PersonID { get; set; }        // <- will be used as primary key
     
    public string PersonName { get; set; }    
}

[आवश्यक] विशेषता

जब एक डोमेन वर्ग की संपत्ति पर लागू किया जाता है, तो डेटाबेस नॉट NULL कॉलम बनाएगा।

using System.ComponentModel.DataAnnotations;

public class Person
{
    public int PersonID { get; set; }
    
    [Required]
    public string PersonName { get; set; }    
}

नहीं पूर्ण बाधा के साथ परिणामी स्तंभ:

SQL सर्वर में परिणामी स्तंभ

नोट: यह asp.net-mvc के साथ एक सत्यापन विशेषता के रूप में भी इस्तेमाल किया जा सकता है।

[MaxLength] और [MinLength] विशेषताएँ

[MaxLength (int)] विशेषता को एक डोमेन वर्ग की स्ट्रिंग या सरणी प्रकार की संपत्ति पर लागू किया जा सकता है। एंटिटी फ्रेमवर्क एक कॉलम का आकार निर्दिष्ट मूल्य पर सेट करेगा।

using System.ComponentModel.DataAnnotations;

public class Person
{
    public int PersonID { get; set; }
    
    [MinLength(3), MaxLength(100)]
    public string PersonName { get; set; }    
}

निर्दिष्ट कॉलम लंबाई के साथ परिणामी कॉलम:

यहाँ छवि विवरण दर्ज करें

[MinLength (int)] विशेषता एक सत्यापन विशेषता है, यह डेटाबेस संरचना को प्रभावित नहीं करता है। यदि हम पर्सननेम वाले व्यक्ति को 3 वर्णों से कम लंबाई के साथ सम्मिलित / अद्यतन करने का प्रयास करते हैं, तो यह प्रतिबद्ध विफल हो जाएगा। हमें एक DbUpdateConcurrencyException जिसे हमें संभालना होगा।

using (var db = new ApplicationDbContext())
{                    
     db.Staff.Add(new Person() { PersonName = "ng" });
     try
     {
          db.SaveChanges();
     }
     catch (DbEntityValidationException ex)
     {
          //ErrorMessage = "The field PersonName must be a string or array type with a minimum length of '3'."
     }
}

दोनों [MaxLength] और [MinLength] विशेषताओं का उपयोग asp.net-mvc के साथ सत्यापन विशेषता के रूप में भी किया जा सकता है।

[रेंज (न्यूनतम, अधिकतम)] विशेषता

एक संपत्ति के लिए एक संख्यात्मक न्यूनतम और अधिकतम सीमा निर्दिष्ट करता है

using System.ComponentModel.DataAnnotations;   

public partial class Enrollment
{
    public int EnrollmentID { get; set; }
   
    [Range(0, 4)]
    public Nullable<decimal> Grade { get; set; }
}

यदि हम श्रेणी से बाहर मूल्य वाले ग्रेड को सम्मिलित / अद्यतन करने का प्रयास करते हैं, तो यह प्रतिबद्ध विफल हो जाएगा। हमें एक DbUpdateConcurrencyException जिसे हमें संभालना होगा।

using (var db = new ApplicationDbContext())
{
    db.Enrollments.Add(new Enrollment() { Grade = 1000 });

    try
    {
        db.SaveChanges();
    }
    catch (DbEntityValidationException ex)
    {
        // Validation failed for one or more entities
    }
}

यह एक मान्यता विशेषता के रूप में asp.net-mvc के साथ भी इस्तेमाल किया जा सकता है।

परिणाम:

यहाँ छवि विवरण दर्ज करें

[डेटाबेसबद्ध] विशेषता

निर्दिष्ट करता है कि डेटाबेस संपत्ति के लिए मान कैसे उत्पन्न करता है। तीन संभावित मूल्य हैं:

  1. None निर्दिष्ट नहीं करता है कि डेटाबेस द्वारा मान उत्पन्न नहीं किए गए हैं।
  2. Identity निर्दिष्ट करती है कि स्तंभ एक पहचान स्तंभ है , जो आमतौर पर पूर्णांक प्राथमिक कुंजी के लिए उपयोग किया जाता है।
  3. Computed निर्दिष्ट करता है कि डेटाबेस कॉलम के लिए मान उत्पन्न करता है।

यदि मान कुछ भी None , तो एंटिटी फ्रेमवर्क डेटाबेस में वापस संपत्ति में किए गए बदलावों को नहीं करेगा।

डिफ़ॉल्ट रूप से ( StoreGeneratedIdentityKeyConvention पर आधारित) एक पूर्णांक कुंजी गुण को पहचान स्तंभ के रूप में माना जाएगा। इस सम्मेलन को ओवरराइड और मजबूर यह एक गैर पहचान स्तंभ आप उपयोग कर सकते हैं के रूप में व्यवहार किया जाना करने के लिए DatabaseGenerated के एक मूल्य के साथ विशेषता None

using System.ComponentModel.DataAnnotations.Schema;

public class Foo
{
    [Key]
    public int Id { get; set; } // identity (auto-increment) column
}

public class Bar
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int Id { get; set; } // non-identity column
}

निम्न एसक्यूएल एक गणना कॉलम के साथ एक तालिका बनाता है:

CREATE TABLE [Person] (
    Name varchar(100) PRIMARY KEY,
    DateOfBirth Date NOT NULL,
    Age AS DATEDIFF(year, DateOfBirth, GETDATE())
)
GO

उपरोक्त तालिका में रिकॉर्ड का प्रतिनिधित्व करने के लिए एक इकाई बनाने के लिए, आप का उपयोग करने की आवश्यकता होगी DatabaseGenerated के एक मूल्य के साथ विशेषता Computed

[Table("Person")]
public class Person
{
    [Key, StringLength(100)]
    public string Name { get; set; }
    public DateTime DateOfBirth { get; set; }
    [DatabaseGenerated(DatabaseGeneratedOption.Computed)]
    public int Age { get; set; }
}

[NotMapped] विशेषता

कोड-प्रथम सम्मेलन द्वारा, एंटिटी फ्रेमवर्क प्रत्येक सार्वजनिक संपत्ति के लिए एक स्तंभ बनाता है जो एक समर्थित डेटा प्रकार का होता है और इसमें एक गेट्टर और एक सेटर दोनों होते हैं। [NotMapped] एनोटेशन किसी भी गुण के लिए लागू किया जाना चाहिए, जिसके लिए हमें डेटाबेस तालिका में कॉलम नहीं चाहिए।

एक संपत्ति का एक उदाहरण जिसे हम डेटाबेस में संग्रहीत नहीं करना चाहते हैं, एक छात्र का पहला नाम उनके पहले और अंतिम नाम के आधार पर है। यह मक्खी पर गिना जा सकता है और इसे डेटाबेस में संग्रहीत करने की कोई आवश्यकता नहीं है।

public string FullName => string.Format("{0} {1}", FirstName, LastName);

"FullName" संपत्ति में केवल एक गेटटर और कोई सेटर नहीं है, इसलिए डिफ़ॉल्ट रूप से, Entity फ्रेमवर्क इसके लिए एक कॉलम नहीं बनाएगा।

एक संपत्ति का एक और उदाहरण जिसे हम डेटाबेस में संग्रहीत नहीं करना चाहते हैं वह एक छात्र का "एवरग्रेड" है। हम औसत-मांग पर प्राप्त नहीं करना चाहते हैं; इसके बजाय हमारी दिनचर्या कहीं और हो सकती है जो इसकी गणना करती है।

[NotMapped]
public float AverageGrade { set; get; }

"एवरग्रेड" को चिह्नित किया जाना चाहिए [नोटमैपेड] एनोटेशन, अन्यथा एंटिटी फ्रेमवर्क इसके लिए एक कॉलम बनाएगा।

using System.ComponentModel.DataAnnotations.Schema;

public class Student
{
    public int Id { set; get; }

    public string FirstName { set; get; }

    public string LastName { set; get; }

    public string FullName => string.Format("{0} {1}", FirstName, LastName);

    [NotMapped]
    public float AverageGrade { set; get; }
}

उपरोक्त इकाई के लिए हम DbMigration.cs अंदर DbMigration.cs

CreateTable(
    "dbo.Students",
     c => new
         {
             Id = c.Int(nullable: false, identity: true),
             FirstName = c.String(),
             LastName = c.String(),
         })
     .PrimaryKey(t => t.Id);

और SQL सर्वर प्रबंधन स्टूडियो में

यहाँ छवि विवरण दर्ज करें

[तालिका] विशेषता

[Table("People")]
public class Person
{
    public int PersonID { get; set; }
    public string PersonName { get; set; }    
}

इकाई उत्पन्न करने के बजाय विशिष्ट तालिका नाम का उपयोग करने के लिए इकाई ढाँचा बताता है (अर्थात Person या Persons )

हम [तालिका] विशेषता का उपयोग करके तालिका के लिए एक स्कीमा भी निर्दिष्ट कर सकते हैं

[Table("People", Schema = "domain")]

[कॉलम] विशेषता

public class Person
{
    public int PersonID { get; set; }
    
    [Column("NameOfPerson")]
    public string PersonName { get; set; }    
}

संपत्ति के नाम का उपयोग करने के बजाय एक विशिष्ट कॉलम नाम का उपयोग करने के लिए एंटिटी फ्रेमवर्क बताता है। आप डेटाबेस डेटा प्रकार और तालिका में कॉलम का क्रम भी निर्दिष्ट कर सकते हैं:

[Column("NameOfPerson", TypeName = "varchar", Order = 1)]
public string PersonName { get; set; }    

[सूचकांक] विशेषता

public class Person
{
    public int PersonID { get; set; }
    public string PersonName { get; set; }

    [Index]
    public int Age { get; set; }
}

स्तंभ या स्तंभों के सेट के लिए डेटाबेस इंडेक्स बनाता है।

[Index("IX_Person_Age")]
public int Age { get; set; }

यह एक विशिष्ट नाम के साथ एक सूचकांक बनाता है।

[Index(IsUnique = true)]
public int Age { get; set; }

यह एक अद्वितीय सूचकांक बनाता है।

[Index("IX_Person_NameAndAge", 1)]
public int Age { get; set; }

[Index("IX_Person_NameAndAge", 2)]
public string PersonName { get; set; }

यह 2 कॉलम का उपयोग कर एक संयुक्त सूचकांक बनाता है। ऐसा करने के लिए आपको एक ही इंडेक्स नाम निर्दिष्ट करना होगा और एक कॉलम ऑर्डर देना होगा।

नोट : सूचकांक विशेषता इकाई ढांचे में शुरू की गई थी 6.1। यदि आप पहले वाले संस्करण का उपयोग कर रहे हैं तो इस खंड में जानकारी लागू नहीं होती है।

[ForeignKey (स्ट्रिंग)] विशेषता

कस्टम विदेशी कुंजी नाम निर्दिष्ट करता है यदि ईएफ के सम्मेलन का पालन नहीं करने वाली एक विदेशी कुंजी वांछित है।

public class Person 
{
    public int IdAddress { get; set; }

    [ForeignKey(nameof(IdAddress))]
    public virtual Address HomeAddress { get; set; }
}

यह तब भी उपयोग किया जा सकता है जब आपके पास एक ही इकाई प्रकार के कई संबंध हों।

using System.ComponentModel.DataAnnotations.Schema;

public class Customer
{
    ...

    public int MailingAddressID { get; set; }
    public int BillingAddressID { get; set; }

    [ForeignKey("MailingAddressID")]
    public virtual Address MailingAddress { get; set; }
    [ForeignKey("BillingAddressID")]
    public virtual Address BillingAddress { get; set; }
}

बिना ForeignKey गुण, एफई उन्हें मिश्रित हो जाते हैं और के मूल्य का उपयोग हो सकता है BillingAddressID जब प्राप्त करने में कठिनाई MailingAddress , या यह सिर्फ स्तंभ का अपना नामकरण सम्मेलनों (तरह के आधार पर लिए एक अलग नाम के साथ आते हैं हो सकता है Address_MailingAddress_Id ) और उपयोग करने के लिए कि कोशिश इसके बजाय (यदि आप किसी मौजूदा डेटाबेस के साथ इसका उपयोग कर रहे हैं तो त्रुटि होगी)।

[StringLength (int)] विशेषता

using System.ComponentModel.DataAnnotations;

public class Post
{
    public int Id { get; set; }
    
    [StringLength(100)]
    public string Title { get; set;}

    [StringLength(300)]
    public string Abstract { get; set; }
    
    public string Description { get; set; }
}

एक स्ट्रिंग फ़ील्ड के लिए अधिकतम लंबाई निर्धारित करता है।

यहाँ छवि विवरण दर्ज करें

नोट : यह asp.net-mvc के साथ एक सत्यापन विशेषता के रूप में भी इस्तेमाल किया जा सकता है।

[टाइमस्टैम्प] विशेषता

[टाइमस्टैम्प] विशेषता को दिए गए इकाई वर्ग में केवल एक बाइट सरणी संपत्ति पर लागू किया जा सकता है। एंटिटी फ्रेमवर्क उस संपत्ति के लिए डेटाबेस तालिका में एक गैर-अशक्त टाइमस्टैम्प कॉलम बनाएगा। एंटिटी फ्रेमवर्क स्वतः समयावधि जाँच में इस टाइमस्टैम्प कॉलम का उपयोग करेगा।

using System.ComponentModel.DataAnnotations.Schema;

public class Student
{
    public int Id { set; get; }

    public string FirstName { set; get; }

    public string LastName { set; get; }    

    [Timestamp]
    public byte[] RowVersion { get; set; }
}

यहाँ छवि विवरण दर्ज करें

[ConcurrencyCheck] विशेषता

यह गुण क्लास प्रॉपर्टी पर लागू होता है। जब आप समसामयिक जाँच के लिए विद्यमान स्तंभों का उपयोग करना चाहते हैं, तो आप संगामिति चेक विशेषता का उपयोग कर सकते हैं, न कि संगामिति के लिए एक अलग टाइमस्टैम्प स्तंभ।

using System.ComponentModel.DataAnnotations;

public class Author
{
    public int AuthorId { get; set; }
     
    [ConcurrencyCheck]
    public string AuthorName { get; set; }
}

ऊपर के उदाहरण से, ConcurrencyCheck विशेषता लेखक वर्ग की AuthorName संपत्ति पर लागू होती है। इसलिए, कोड-फर्स्ट में ऑथरनेट कॉलम को अपडेट कमांड (जिसमें क्लॉज) में शामिल किया जाएगा, आशावादी संगोष्ठी की जांच करने के लिए।

[InverseProperty (string)] विशेषता

using System.ComponentModel.DataAnnotations.Schema;

public class Department  
{  
    ...

    public virtual ICollection<Employee> PrimaryEmployees { get; set; }  
    public virtual ICollection<Employee> SecondaryEmployees { get; set; }  
}  
  
public class Employee  
{  
    ...

    [InverseProperty("PrimaryEmployees")]  
    public virtual Department PrimaryDepartment { get; set; }  
  
    [InverseProperty("SecondaryEmployees")]  
    public virtual Department SecondaryDepartment { get; set; }  
}  

दो तरह के रिश्तों की पहचान करने के लिए InverseProperty का इस्तेमाल तब किया जा सकता है जब दो संस्थाओं के बीच कई तरह के रिश्ते मौजूद हों।

यह एंटिटी फ्रेमवर्क को बताता है कि कौन सी नेविगेशन संपत्तियों को दूसरी तरफ गुणों के साथ मेल खाना चाहिए।

एंटिटी फ्रेमवर्क को यह नहीं पता है कि दो संस्थाओं के बीच कई द्विदिश संबंध मौजूद होने पर कौन से नेविगेशन प्रॉपर्टी का नक्शा दूसरी तरफ है।

यह संबंधित कक्षा में इसके पैरामीटर के रूप में संबंधित नेविगेशन संपत्ति के नाम की आवश्यकता है।

इसका उपयोग उन संस्थाओं के लिए भी किया जा सकता है जिनके पास एक ही प्रकार की अन्य संस्थाओं से संबंध है, एक पुनरावर्ती संबंध बनाते हैं।

using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

public class TreeNode
{
    [Key]
    public int ID { get; set; }
    public int ParentID { get; set; }

    ...

    [ForeignKey("ParentID")]
    public TreeNode ParentNode { get; set; }
    [InverseProperty("ParentNode")]
    public virtual ICollection<TreeNode> ChildNodes { get; set; }
}

तालिका में विदेशी कुंजी के लिए उपयोग किए जाने वाले स्तंभ को निर्दिष्ट करने के लिए ForeignKey विशेषता का उपयोग भी नोट करें। पहले उदाहरण में, Employee वर्ग की दो संपत्तियों में कॉलम नामों को परिभाषित करने के लिए ForeignKey विशेषता को लागू किया जा सकता था।

[ComplexType] विशेषता

using System.ComponentModel.DataAnnotations.Schema;

[ComplexType] 
public class BlogDetails 
{ 
    public DateTime? DateCreated { get; set; } 
 
    [MaxLength(250)] 
    public string Description { get; set; } 
}

public class Blog
{
    ...

    public BlogDetails BlogDetail { get; set; }
}

एंटिटी फ्रेमवर्क में जटिल प्रकार के रूप में वर्ग को चिह्नित करें।

जटिल प्रकार (या डोमेन ऑब्जेक्ट डिज़ाइन में मूल्य ऑब्जेक्ट ) को अपने दम पर ट्रैक नहीं किया जा सकता है लेकिन उन्हें एक इकाई के हिस्से के रूप में ट्रैक किया जाता है। यही कारण है कि उदाहरण में BlogDetails के पास एक महत्वपूर्ण संपत्ति नहीं है।

कॉम्प्लेक्स टाइप का पता लगाया जा रहा है

वे कई वर्गों में डोमेन एंटिटीज़ का वर्णन करते समय और उन क्लासेस को एक संपूर्ण इकाई में ले जाने के दौरान उपयोगी हो सकते हैं।



Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow