Entity Framework
उन्नत मानचित्रण परिदृश्य: इकाई विभाजन, टेबल विभाजन
खोज…
परिचय
इकाई विभाजन या टेबल विभाजन का समर्थन करने के लिए अपने ईएफ मॉडल को कैसे कॉन्फ़िगर करें।
इकाई विभाजन
तो मान लें कि आपके पास एक इकाई वर्ग है:
public class Person
{
public int PersonId { get; set; }
public string Name { get; set; }
public string ZipCode { get; set; }
public string City { get; set; }
public string AddressLine { get; set; }
}
और फिर मान लें कि आप इस व्यक्ति इकाई को दो तालिकाओं में मैप करना चाहते हैं - एक व्यक्ति और नाम के साथ और दूसरा विवरण विवरण के साथ। निश्चित रूप से आपको यहां व्यक्ति की पहचान करने के लिए व्यक्तिगत पहचान की आवश्यकता होगी ताकि पता चले कि वह किस व्यक्ति का है। तो मूल रूप से आप जो चाहते हैं वह इकाई को दो (या इससे भी अधिक) भागों में विभाजित करना है। इसलिए नाम, इकाई विभाजन। आप प्रत्येक गुण को एक अलग तालिका में मैप करके ऐसा कर सकते हैं:
public class MyDemoContext : DbContext
{
public DbSet<Person> Products { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Person>().Map(m =>
{
m.Properties(t => new { t.PersonId, t.Name });
m.ToTable("People");
}).Map(m =>
{
m.Properties(t => new { t.PersonId, t.AddressLine, t.City, t.ZipCode });
m.ToTable("PersonDetails");
});
}
}
इससे दो टेबल बनेंगे: पीपल एंड पर्सनेलटेल्स। व्यक्ति के दो क्षेत्र होते हैं, व्यक्ति और नाम, व्यक्ति के चार कॉलम होते हैं, व्यक्ति, पता, शहर और ज़िपकोड। पीपल में, PersonId प्राथमिक कुंजी है। PersonDetails में प्राथमिक कुंजी भी PersonId है, लेकिन यह व्यक्ति तालिका में एक व्यक्तिगत कुंजी संदर्भित PersonId भी है।
यदि आप लोग DbSet को क्वेरी करते हैं, तो EF व्यक्ति को पॉप्युलेट करने के लिए दोनों तालिकाओं से डेटा प्राप्त करने के लिए PersonalIds पर एक जॉइन करेगा।
आप कॉलम का नाम भी बदल सकते हैं:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Person>().Map(m =>
{
m.Properties(t => new { t.PersonId });
m.Property(t => t.Name).HasColumnName("PersonName");
m.ToTable("People");
}).Map(m =>
{
m.Property(t => t.PersonId).HasColumnName("ProprietorId");
m.Properties(t => new { t.AddressLine, t.City, t.ZipCode });
m.ToTable("PersonDetails");
});
}
यह समान तालिका संरचना बनाएगा, लेकिन पीपल तालिका में नाम कॉलम के बजाय एक व्यक्तिनाम कॉलम होगा, और व्यक्ति तालिका में व्यक्ति आईडी कॉलम के बजाय एक प्रोप्राइटरआईआरडी होगा।
टेबल विभाजन
और अब मान लें कि आप इकाई विभाजन के विपरीत करना चाहते हैं: एक इकाई को दो तालिकाओं में मैप करने के बजाय, आप एक तालिका को दो संस्थाओं में मैप करना चाहेंगे। इसे टेबल स्प्लिटिंग कहा जाता है। मान लें कि आपके पास पांच स्तंभों के साथ एक तालिका है: PersonId, Name, AddressLine, City, ZipCode, जहां PersonId प्राथमिक कुंजी है। और फिर आप इस तरह एक ईएफ मॉडल बनाना चाहेंगे:
public class Person
{
public int PersonId { get; set; }
public string Name { get; set; }
public Address Address { get; set; }
}
public class Address
{
public string ZipCode { get; set; }
public string City { get; set; }
public string AddressLine { get; set; }
public int PersonId { get; set; }
public Person Person { get; set; }
}
एक बात सही निकलती है: एड्रेस में कोई एड्रेसआईड नहीं है। ऐसा इसलिए है क्योंकि दो संस्थाओं को एक ही तालिका में मैप किया जाता है, इसलिए उनके पास एक ही प्राथमिक कुंजी भी होनी चाहिए। यदि आप टेबल विभाजन करते हैं, तो यह कुछ ऐसा है जिससे आपको निपटना है। इसलिए टेबल विभाजन के अलावा, आपको पता इकाई को भी कॉन्फ़िगर करना होगा और प्राथमिक कुंजी निर्दिष्ट करनी होगी। और यहाँ है कैसे:
public class MyDemoContext : DbContext
{
public DbSet<Person> Products { get; set; }
public DbSet<Address> Addresses { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Address>().HasKey(t => t.PersonId);
modelBuilder.Entity<Person>().HasRequired(t => t.Address)
.WithRequiredPrincipal(t => t.Person);
modelBuilder.Entity<Person>().Map(m => m.ToTable("People"));
modelBuilder.Entity<Address>().Map(m => m.ToTable("People"));
}
}