Entity Framework
कोड प्रथम - धाराप्रवाह एपीआई
खोज…
टिप्पणियों
HOW एंटिटी फ्रेमवर्क को निर्दिष्ट करने के दो सामान्य तरीके हैं, POCO क्लासेस को डेटाबेस टेबल, कॉलम आदि में मैप करेंगे। डेटा एनोटेशन और धाराप्रवाह एपीआई ।
हालांकि डेटा एनोटेशन पढ़ने और समझने में सरल हैं, लेकिन उनमें एक इकाई के लिए "कैस्केड ऑन डिलीट" व्यवहार को निर्दिष्ट करने जैसी कुछ विशेषताओं का अभाव है। दूसरी ओर धाराप्रवाह एपीआई उपयोग करने के लिए थोड़ा अधिक जटिल है, लेकिन सुविधाओं के कहीं अधिक उन्नत सेट प्रदान करता है।
मैपिंग मॉडल
EntityFramewok धाराप्रवाह एपीआई आपके कोड-प्रथम डोमेन मॉडल को अंतर्निहित डेटाबेस में मैप करने का एक शक्तिशाली और सुरुचिपूर्ण तरीका है। यह मौजूदा डेटाबेस के साथ कोड-प्रथम के साथ भी इस्तेमाल किया जा सकता है। आप जब Fluent एपीआई का उपयोग कर दो विकल्प हैं: आप सीधे OnModelCreating पद्धति पर अपने मॉडल मैप कर सकते हैं या आप नक्शाकार वर्ग है जो EntityTypeConfiguration से विरासत में मिली और उसके बाद OnModelCreating पद्धति पर modelBuilder है कि मॉडल जोड़ बना सकते हैं। दूसरा विकल्प वह है जिसे मैं पसंद करता हूं और इसका उदाहरण दिखाने जा रहा हूं।
एक कदम: मॉडल बनाएँ।
public class Employee
{
public int Id { get; set; }
public string Surname { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public short Age { get; set; }
public decimal MonthlySalary { get; set; }
public string FullName
{
get
{
return $"{Surname} {FirstName} {LastName}";
}
}
}
चरण दो: मैपर क्लास बनाएं
public class EmployeeMap
: EntityTypeConfiguration<Employee>
{
public EmployeeMap()
{
// Primary key
this.HasKey(m => m.Id);
this.Property(m => m.Id)
.HasColumnType("int")
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
// Properties
this.Property(m => m.Surname)
.HasMaxLength(50);
this.Property(m => m.FirstName)
.IsRequired()
.HasMaxLength(50);
this.Property(m => m.LastName)
.HasMaxLength(50);
this.Property(m => m.Age)
.HasColumnType("smallint");
this.Property(m => m.MonthlySalary)
.HasColumnType("number")
.HasPrecision(14, 5);
this.Ignore(m => m.FullName);
// Table & column mappings
this.ToTable("TABLE_NAME", "SCHEMA_NAME");
this.Property(m => m.Id).HasColumnName("ID");
this.Property(m => m.Surname).HasColumnName("SURNAME");
this.Property(m => m.FirstName).HasColumnName("FIRST_NAME");
this.Property(m => m.LastName).HasColumnName("LAST_NAME");
this.Property(m => m.Age).HasColumnName("AGE");
this.Property(m => m.MonthlySalary).HasColumnName("MONTHLY_SALARY");
}
}
हमें मैपिंग के बारे में बताएं:
- HasKey - प्राथमिक कुंजी को परिभाषित करता है। समग्र प्राथमिक कुंजियों का भी उपयोग किया जा सकता है। उदाहरण के लिए: यह। HKKey (m => नया {m.DepartmentId, m.PositionId}) ।
- संपत्ति - हमें मॉडल गुणों को कॉन्फ़िगर करने की अनुमति देता है।
- HasColumnType - डेटाबेस स्तर कॉलम प्रकार निर्दिष्ट करें। कृपया ध्यान दें कि, यह अलग-अलग डेटाबेस जैसे Oracle और MS SQL के लिए भिन्न हो सकता है।
- HasDatabaseGeneratedOption - निर्दिष्ट करता है कि क्या संपत्ति की गणना डेटाबेस स्तर पर की जाती है। संख्यात्मक पीकेएस डिफ़ॉल्ट रूप से DatabaseGeneratedOption.Identity हैं, तो आप DatabaseGeneratedOption.None अगर तुम उन्हें ऐसा हो नहीं करना चाहते निर्दिष्ट करना चाहिए।
- HasMaxLength - स्ट्रिंग की लंबाई को सीमित करता है।
- IsRequired - आवश्यक के रूप में संपत्ति को चिह्नित करता है।
- HasPreaches - हमें दशमलव के लिए सटीक निर्दिष्ट करने की अनुमति देता है।
- ध्यान न दें - संपत्ति को पूरी तरह से अनदेखा करता है और इसे डेटाबेस में मैप नहीं करता है। हमने FullName को नज़रअंदाज़ कर दिया, क्योंकि हम अपनी मेज पर यह कॉलम नहीं चाहते हैं।
- ToTable - मॉडल के लिए तालिका का नाम और स्कीमा नाम (वैकल्पिक) निर्दिष्ट करें।
- HasColumnName - स्तंभ नाम के साथ संपत्ति से संबंधित है। प्रॉपर्टी के नाम और कॉलम के नाम समान होने पर इसकी जरूरत नहीं है।
चरण तीन: कॉन्फ़िगरेशन में मैपिंग क्लास जोड़ें।
हमें अपने मैपर वर्ग का उपयोग करने के लिए EntityFramework को बताने की आवश्यकता है। ऐसा करने के लिए, हमें इसे ModelBuilder.Configurations पर OnModelCreating विधि में जोड़ना होगा:
public class DbContext()
: base("Name=DbContext")
{
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.Add(new EmployeeMap());
}
}
और वह यह है। हम सब जाने के लिए तैयार हैं।
प्राथमिक कुंजी
.HasKey () पद्धति का उपयोग करके, किसी संपत्ति को इकाई की प्राथमिक कुंजी के रूप में स्पष्ट रूप से कॉन्फ़िगर किया जा सकता है।
using System.Data.Entity;
// ..
public class PersonContext : DbContext
{
// ..
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
// ..
modelBuilder.Entity<Person>().HasKey(p => p.PersonKey);
}
}
समग्र प्राथमिक कुंजी
.HasKey () पद्धति का उपयोग करके, गुणों का एक समूह इकाई के समग्र प्राथमिक कुंजी के रूप में स्पष्ट रूप से कॉन्फ़िगर किया जा सकता है।
using System.Data.Entity;
// ..
public class PersonContext : DbContext
{
// ..
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
// ..
modelBuilder.Entity<Person>().HasKey(p => new { p.FirstName, p.LastName });
}
}
अधिकतम लंबाई
.HasMaxLength () पद्धति का उपयोग करके, किसी गुण के लिए अधिकतम वर्ण गणना कॉन्फ़िगर की जा सकती है।
using System.Data.Entity;
// ..
public class PersonContext : DbContext
{
// ..
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
// ..
modelBuilder.Entity<Person>()
.Property(t => t.Name)
.HasMaxLength(100);
}
}
निर्दिष्ट कॉलम लंबाई के साथ परिणामी कॉलम:
आवश्यक गुण (पूर्ण नहीं)
.IsRequired () पद्धति का उपयोग करके, गुणों को अनिवार्य के रूप में निर्दिष्ट किया जा सकता है, जिसका अर्थ है कि कॉलम में एक पूर्ण नाल बाधा नहीं होगी।
using System.Data.Entity;
// ..
public class PersonContext : DbContext
{
// ..
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
// ..
modelBuilder.Entity<Person>()
.Property(t => t.Name)
.IsRequired();
}
}
नहीं पूर्ण बाधा के साथ परिणामी स्तंभ:
विदेशी कुंजी नामकरण की व्याख्या करें
जब एक नेविगेशन प्रॉपर्टी एक मॉडल पर मौजूद होती है, तो Entity Framework स्वचालित रूप से एक फॉरेन की कॉलम बनाएगा। यदि एक विशिष्ट विदेशी कुंजी नाम वांछित है, लेकिन मॉडल में एक संपत्ति के रूप में निहित नहीं है, तो इसे धाराप्रवाह एपीआई का उपयोग करके स्पष्ट रूप से सेट किया जा सकता है। फॉरेन की रिलेशनशिप को स्थापित करते समय Map
विधि का उपयोग करके, किसी भी अनूठे नाम का उपयोग फॉरेन कीज के लिए किया जा सकता है।
public class Company
{
public int Id { get; set; }
}
public class Employee
{
property int Id { get; set; }
property Company Employer { get; set; }
}
public class EmployeeContext : DbContext
{
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Employee>()
.HasRequired(x => x.Employer)
.WithRequiredDependent()
.Map(m => m.MapKey("EmployerId"));
}
}
संबंध निर्दिष्ट करने के बाद, Map
विधि विदेशी कुंजी नाम को स्पष्ट रूप से MapKey
निष्पादित करके सेट करने की अनुमति देती है। इस उदाहरण में, Employer_Id के कॉलम नाम का क्या परिणाम होगा, अब EmployerId है।