একটি কাস্টমাইজড যোগদানের টেবিলের সাথে একাধিক থেকে বেশি সম্পর্ক তৈরি করা সম্ভব নয়। বহু-বহু সম্পর্কের মধ্যে ইএফ অভ্যন্তরীণ এবং লুকিয়ে থাকা টেবিল পরিচালনা করে। এটি আপনার মডেলের কোনও সত্তা শ্রেণিবিহীন একটি টেবিল। অতিরিক্ত বৈশিষ্ট্য সহ এ জাতীয় যোগদানের টেবিলের সাথে কাজ করতে আপনাকে আসলে দুটি এক থেকে বহু সম্পর্ক তৈরি করতে হবে। এটি দেখতে এটি দেখতে পারে:
public class Member
{
public int MemberID { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public virtual ICollection<MemberComment> MemberComments { get; set; }
}
public class Comment
{
public int CommentID { get; set; }
public string Message { get; set; }
public virtual ICollection<MemberComment> MemberComments { get; set; }
}
public class MemberComment
{
[Key, Column(Order = 0)]
public int MemberID { get; set; }
[Key, Column(Order = 1)]
public int CommentID { get; set; }
public virtual Member Member { get; set; }
public virtual Comment Comment { get; set; }
public int Something { get; set; }
public string SomethingElse { get; set; }
}
আপনি যদি এখন LastName
= "স্মিথ" এর সাথে সদস্যদের সমস্ত মন্তব্য সন্ধান করতে চান তবে আপনি এই জাতীয় একটি কোয়েরি লিখতে পারেন:
var commentsOfMembers = context.Members
.Where(m => m.LastName == "Smith")
.SelectMany(m => m.MemberComments.Select(mc => mc.Comment))
.ToList();
... বা ...
var commentsOfMembers = context.MemberComments
.Where(mc => mc.Member.LastName == "Smith")
.Select(mc => mc.Comment)
.ToList();
অথবা "স্মিথ" নামের সদস্যদের একটি তালিকা তৈরি করার জন্য (আমরা ধরে নিই যে সেখানে একের বেশি রয়েছে) তাদের মন্তব্য সহ আপনি একটি প্রক্ষেপণ ব্যবহার করতে পারেন:
var membersWithComments = context.Members
.Where(m => m.LastName == "Smith")
.Select(m => new
{
Member = m,
Comments = m.MemberComments.Select(mc => mc.Comment)
})
.ToList();
আপনি যদি MemberId
1 এর সাথে একজন সদস্যের সমস্ত মন্তব্য সন্ধান করতে চান :
var commentsOfMember = context.MemberComments
.Where(mc => mc.MemberId == 1)
.Select(mc => mc.Comment)
.ToList();
এখন আপনি নিজের যোগদানের টেবিলের বৈশিষ্ট্যগুলিও ফিল্টার করতে পারেন (যা বহু-বহু সম্পর্কের ক্ষেত্রে সম্ভব হবে না), উদাহরণস্বরূপ: সদস্য 1 এর সমস্ত মন্তব্য ফিল্টার করুন যেখানে সম্পত্তি রয়েছে 99 Something
:
var filteredCommentsOfMember = context.MemberComments
.Where(mc => mc.MemberId == 1 && mc.Something == 99)
.Select(mc => mc.Comment)
.ToList();
কারণ অলস লোডিং জিনিসগুলি সহজ হয়ে উঠতে পারে। আপনার যদি বোঝা হয়ে থাকে তবে Member
আপনি একটি স্পষ্ট জিজ্ঞাসা ছাড়াই মন্তব্যগুলি পেতে সক্ষম হবেন:
var commentsOfMember = member.MemberComments.Select(mc => mc.Comment);
আমি অনুমান করি যে অলস লোডিংগুলি পর্দার আড়ালে স্বয়ংক্রিয়ভাবে মন্তব্যগুলি এনে দেবে।
সম্পাদন করা
কেবল মজাদার জন্য সত্তা এবং সম্পর্কগুলি কীভাবে যুক্ত করতে হয় এবং কীভাবে এই মডেলটিতে সেগুলি মুছতে হয় তার কয়েকটি উদাহরণ fun
1) এই সদস্যের একজন সদস্য এবং দুটি মন্তব্য তৈরি করুন:
var member1 = new Member { FirstName = "Pete" };
var comment1 = new Comment { Message = "Good morning!" };
var comment2 = new Comment { Message = "Good evening!" };
var memberComment1 = new MemberComment { Member = member1, Comment = comment1,
Something = 101 };
var memberComment2 = new MemberComment { Member = member1, Comment = comment2,
Something = 102 };
context.MemberComments.Add(memberComment1); // will also add member1 and comment1
context.MemberComments.Add(memberComment2); // will also add comment2
context.SaveChanges();
২) সদস্যের তৃতীয় মন্তব্য যুক্ত করুন:
var member1 = context.Members.Where(m => m.FirstName == "Pete")
.SingleOrDefault();
if (member1 != null)
{
var comment3 = new Comment { Message = "Good night!" };
var memberComment3 = new MemberComment { Member = member1,
Comment = comment3,
Something = 103 };
context.MemberComments.Add(memberComment3); // will also add comment3
context.SaveChanges();
}
3) নতুন সদস্য তৈরি করুন এবং এটি বিদ্যমান মন্তব্যের সাথে সম্পর্কিত করুন 2:
var comment2 = context.Comments.Where(c => c.Message == "Good evening!")
.SingleOrDefault();
if (comment2 != null)
{
var member2 = new Member { FirstName = "Paul" };
var memberComment4 = new MemberComment { Member = member2,
Comment = comment2,
Something = 201 };
context.MemberComments.Add(memberComment4);
context.SaveChanges();
}
4) বিদ্যমান সদস্য 2 এবং মন্তব্য 3 এর মধ্যে সম্পর্ক তৈরি করুন:
var member2 = context.Members.Where(m => m.FirstName == "Paul")
.SingleOrDefault();
var comment3 = context.Comments.Where(c => c.Message == "Good night!")
.SingleOrDefault();
if (member2 != null && comment3 != null)
{
var memberComment5 = new MemberComment { Member = member2,
Comment = comment3,
Something = 202 };
context.MemberComments.Add(memberComment5);
context.SaveChanges();
}
5) এই সম্পর্কটি আবার মুছুন:
var memberComment5 = context.MemberComments
.Where(mc => mc.Member.FirstName == "Paul"
&& mc.Comment.Message == "Good night!")
.SingleOrDefault();
if (memberComment5 != null)
{
context.MemberComments.Remove(memberComment5);
context.SaveChanges();
}
6) সদস্যের 1 এবং এর সমস্ত সম্পর্কের মন্তব্যে মুছুন:
var member1 = context.Members.Where(m => m.FirstName == "Pete")
.SingleOrDefault();
if (member1 != null)
{
context.Members.Remove(member1);
context.SaveChanges();
}
এই সম্পর্ক মুছে ফেলে MemberComments
খুব কারণ মধ্যে একের সাথে অধিকের সম্পর্ক Member
এবং MemberComments
মধ্যে Comment
এবং MemberComments
কনভেনশন দ্বারা ডিলিট ক্যাসকেডিং সঙ্গে সেটআপ হয়। এবং এই ক্ষেত্রে কারণ MemberId
এবং CommentId
মধ্যে MemberComment
বিদেশি কী বৈশিষ্ট্য হিসাবে সনাক্ত করা হয় Member
এবং Comment
নেভিগেশন এড়িয়ে বৈশিষ্ট্য এবং এফ কে বৈশিষ্ট্য যেহেতু টাইপ অ nullable হয় int
সম্পর্ক প্রয়োজন বোধ করা হয় অবশেষে ক্যাসকেডিং-Delete সেটআপ ঘটায়। আমি মনে করি এই মডেলটি উপলব্ধি করে I