Relationships: One-to-Many और Many-to-Many
navigation properties और Fluent API के साथ one-to-many तथा many-to-many relationships का मॉडल बनाएँ और क्वेरी करें।
Relationships: One-to-Many और Many-to-Many, CoddyKit पर C# अकादमी का एक निःशुल्क पाठ है। यह 4 में से 4वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह C# अकादमी सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। C# अकादमी पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
EF कोर में संबंध
EF कोर इकाइयों के बीच तीन प्रकार के संबंधों का मॉडल बनाता है: एक-से-एक, एक-से-अनेक और अनेक-से-अनेक। हर संबंध को नेविगेशन गुणधर्मों से व्यक्त किया जाता है और आवश्यकता होने पर फ़्लुएंट एपीआई से कॉन्फ़िगर किया जाता है।
एक-से-अनेक: इकाई सेटअप
एक Blog में कई पोस्ट होते हैं। आश्रित इकाई (Post) विदेशी कुंजी रखती है। दोनों ओर के नेविगेशन गुणधर्मों से दोनों दिशाओं में संबंधों के बीच जाना संभव होता है।
public class Blog
{
public int Id { get; set; }
public string Name { get; set; } = "";
public ICollection<Post> Posts { get; set; } = new List<Post>();
}
public class Post
{
public int Id { get; set; }
public string Title { get; set; } = "";
public int BlogId { get; set; } // FK
public Blog Blog { get; set; } = null!; // nav property
}फ़्लुएंट एपीआई: एक-से-अनेक
EF कोर परंपरा के आधार पर संबंध का अनुमान लगा लेता है, लेकिन स्पष्टता और कैस्केड हटाने का व्यवहार निर्धारित करने के लिए आप फ़्लुएंट एपीआई से इसे स्पष्ट रूप से कॉन्फ़िगर कर सकते हैं।
protected override void OnModelCreating(ModelBuilder mb)
{
mb.Entity<Blog>()
.HasMany(b => b.Posts)
.WithOne(p => p.Blog)
.HasForeignKey(p => p.BlogId)
.OnDelete(DeleteBehavior.Cascade);
}Include से क्वेरी करना (तुरंत लोड करना)
संबंधित डेटा को उसी क्वेरी में लोड करने के लिए Include का उपयोग करें। नेविगेशन ग्राफ़ में और गहराई तक जाने के लिए ThenInclude का उपयोग करें।
// Load blog with all its posts
var blog = await _db.Blogs
.Include(b => b.Posts)
.FirstOrDefaultAsync(b => b.Id == 1);
// Load posts with their comments too
var blogs = await _db.Blogs
.Include(b => b.Posts)
.ThenInclude(p => p.Comments)
.ToListAsync();जोड़ने वाली इकाई के बिना अनेक-से-अनेक
EF कोर 5+ किसी स्पष्ट जोड़ने वाली इकाई के बिना अनेक-से-अनेक संबंधों का समर्थन करता है। यह इकाई प्रकारों के नामों का उपयोग करके जोड़ तालिका अपने आप बनाता है।
public class Student
{
public int Id { get; set; }
public string Name { get; set; } = "";
public ICollection<Course> Courses { get; set; } = new List<Course>();
}
public class Course
{
public int Id { get; set; }
public string Title { get; set; } = "";
public ICollection<Student> Students { get; set; } = new List<Student>();
}
// EF creates StudentCourse join table automaticallyजोड़ने वाली इकाई के साथ अनेक-से-अनेक
जब जोड़ तालिका में अतिरिक्त कॉलम चाहिए हों, जैसे नामांकन की तारीख या ग्रेड, तब संयुक्त प्राथमिक कुंजी वाली स्पष्ट जोड़ने वाली इकाई बनाएँ।
public class Enrollment
{
public int StudentId { get; set; }
public Student Student { get; set; } = null!;
public int CourseId { get; set; }
public Course Course { get; set; } = null!;
public DateTime EnrolledAt { get; set; }
public decimal? Grade { get; set; }
}
// Fluent API config:
mb.Entity<Enrollment>().HasKey(e => new { e.StudentId, e.CourseId });
mb.Entity<Enrollment>().HasOne(e => e.Student).WithMany(s => s.Enrollments);
mb.Entity<Enrollment>().HasOne(e => e.Course).WithMany(c => c.Enrollments);संबंधित डेटा डालना
SaveChangesAsync को कॉल करने से पहले संबंधित इकाइयों को मूल इकाई के संग्रह में जोड़ें। EF कोर FK मानों को अपने आप संभालता है।
var blog = new Blog { Name = "Dev Notes" };
blog.Posts.Add(new Post { Title = "Hello EF Core" });
blog.Posts.Add(new Post { Title = "Migrations Deep Dive" });
_db.Blogs.Add(blog);
await _db.SaveChangesAsync();
// Inserts Blog + 2 Posts with correct BlogId FKसंबंधित डेटा पर फ़िल्टर लगाना
आप LINQ में नेविगेशन गुणधर्मों पर फ़िल्टर लगा सकते हैं। EF कोर इन्हें अपने आप एसक्यूएल JOIN में बदल देता है।
// Blogs that have at least one published post
var popularBlogs = await _db.Blogs
.Where(b => b.Posts.Any(p => p.IsPublished))
.Select(b => new { b.Name, PostCount = b.Posts.Count(p => p.IsPublished) })
.OrderByDescending(b => b.PostCount)
.ToListAsync();कैस्केड हटाना
DeleteBehavior.Cascade के साथ, मुख्य इकाई (Blog) को हटाने पर सभी आश्रित इकाइयाँ (पोस्ट) अपने आप हट जाती हैं। अन्य विकल्प हैं: SetNull, Restrict, NoAction।
// Delete a blog and all its posts
var blog = await _db.Blogs.FindAsync(1);
_db.Blogs.Remove(blog!);
await _db.SaveChangesAsync();
// Cascade: all Posts with BlogId=1 are also deletedमान ऑब्जेक्ट के लिए स्वामित्व वाली इकाइयाँ
स्वामित्व वाली इकाई के प्रकार मान ऑब्जेक्ट, जैसे Address, के लिए बहुत उपयोगी होते हैं। इन्हें स्वामी वाली उसी तालिका में रखा जाता है और इनकी कोई स्वतंत्र पहचान नहीं होती।
public class Customer
{
public int Id { get; set; }
public string Name { get; set; } = "";
public Address ShippingAddress { get; set; } = new();
}
public class Address
{
public string Street { get; set; } = "";
public string City { get; set; } = "";
public string Country { get; set; } = "";
}
// Fluent API:
mb.Entity<Customer>().OwnsOne(c => c.ShippingAddress);वास्तविक उदाहरण: पंक्ति मदों वाला ऑर्डर
एक पूरा ई-कॉमर्स पैटर्न: Order मुख्य इकाई है, जिसके कई OrderLines आश्रित हैं और हर OrderLine किसी Product को संदर्भित करता है।
var order = await _db.Orders
.Include(o => o.Lines)
.ThenInclude(l => l.Product)
.FirstOrDefaultAsync(o => o.Id == orderId);
if (order is null) return Results.NotFound();
var summary = new
{
OrderId = order.Id,
Total = order.Lines.Sum(l => l.Quantity * l.Product.Price),
Items = order.Lines.Select(l => new
{
l.Product.Name,
l.Quantity,
LineTotal = l.Quantity * l.Product.Price
})
};
return Results.Ok(summary);त्वरित जाँच
स्पष्ट जोड़ने वाली इकाई के बिना EF कोर जोड़ तालिका अपने आप कब बनाता है?
पुनरावलोकन: EF कोर में संबंध
मुख्य बातें:
- एक-से-अनेक: FK आश्रित इकाई पर होती है; दोनों ओर नेविगेशन होता है; लोड करने के लिए Include का उपयोग करें
- अनेक-से-अनेक (सरल): दो ICollection नेविगेशन — EF कोर जोड़ तालिका अपने आप बनाता है
- अनेक-से-अनेक (अतिरिक्त डेटा के साथ): संयुक्त PK वाली स्पष्ट जोड़ने वाली इकाई
- कैस्केड हटाना नियंत्रित करता है कि मुख्य इकाई हटाए जाने पर आश्रित इकाइयों के साथ क्या होगा
- स्वामित्व वाली इकाइयाँ स्वामी वाली उसी तालिका में मान ऑब्जेक्ट का मॉडल बनाती हैं
एआई शिक्षक के साथ C# सीखें — निःशुल्क
अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।
- पाठ्यक्रम
- 93
- पाठ
- 346
अक्सर पूछे जाने वाले प्रश्न
क्या “Relationships: One-to-Many और Many-to-Many” पाठ निःशुल्क है?
हाँ—“Relationships: One-to-Many और Many-to-Many” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और C# अकादमी पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। C# अकादमी पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
“Relationships: One-to-Many और Many-to-Many” में मैं क्या सीखूँगा?
navigation properties और Fluent API के साथ one-to-many तथा many-to-many relationships का मॉडल बनाएँ और क्वेरी करें। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ C# अकादमी का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।
क्या C# अकादमी शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?
पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर C# अकादमी शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 4वाँ पाठ है।
“Relationships: One-to-Many और Many-to-Many” पाठ पूरा करने में कितना समय लगता है?
CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।
क्या मैं इस C# अकादमी पाठ में कोड लिख और चला सकता हूँ?
हाँ। हर C# अकादमी पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।
इस पाठ्यक्रम के सभी पाठ
- DbContext और DbSet की मूल बातें
- Migrations और Schema प्रबंधन
- EF Core के साथ CRUD Operations
- Relationships: One-to-Many और Many-to-Many