Kod ilk olarak, daha çok, Birliği tablo ek alanlar oluşturmak
Bu senaryo var:
public class Member
{
public int MemberID { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public virtual ICollection<Comment> Comments { get; set; }
}
public class Comment
{
public int CommentID { get; set; }
public string Message { get; set; }
public virtual ICollection<Member> Members { get; set; }
}
public class MemberComment
{
public int MemberID { get; set; }
public int CommentID { get; set; }
public int Something { get; set; }
public string SomethingElse { get; set; }
}
Nasıl akıcı API ile bağlantım yapılandırabilirim? Yoksa oluşturmak için daha iyi bir yol Derneği tablo?
CEVAP
Mümkün katılın özelleştirilmiş bir tablo ile çok-çok ilişki oluşturmak için değil. Çok-çok ilişki EF katılın masa içten ve gizli yönetir. Modeliniz bir Varlık sınıfı olmayan bir tablo. Aslında iki oluşturmak zorunda kalacaksınız ek özellikleri ile bu tür bir birleştirme tablo ile çalışmak için bir-çok ilişkileri. Bu gibi görünebilir:
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; }
}
Eğer şimdi "Smith" örneğin bu gibi bir sorgu yazabilirsiniz:. * = * 16 ile üyelerinin tüm yorumlar bulmak istiyorsanız
var commentsOfMembers = context.Members
.Where(m => m.LastName == "Smith")
.SelectMany(m => m.MemberComments.Select(mc => mc.Comment))
.ToList();
...veya...
var commentsOfMembers = context.MemberComments
.Where(mc => mc.Member.LastName == "Smith")
.Select(mc => mc.Comment)
.ToList();
Ya da adı ile üye listesi oluşturmak için "" (birden fazla olduğunu varsayıyoruz) ile birlikte kendi yorumlarını size bir projeksiyon kullanabilirsiniz: . Smith
var membersWithComments = context.Members
.Where(m => m.LastName == "Smith")
.Select(m => new
{
Member = m,
Comments = m.MemberComments.Select(mc => mc.Comment)
})
.ToList();
Eğer MemberId
= 1 ile bir üyenin tüm açıklamalar bulmak istiyorsanız:
var commentsOfMember = context.MemberComments
.Where(mc => mc.MemberId == 1)
.Select(mc => mc.Comment)
.ToList();
Şimdi de filtre özelliklerini de size katılmak tablo (olmaz olası bir çok-çok ilişki), örneğin: Filtre tüm yorumlar üye 1 olan bir 99 özelliği Something
:
var filteredCommentsOfMember = context.MemberComments
.Where(mc => mc.MemberId == 1 && mc.Something == 99)
.Select(mc => mc.Comment)
.ToList();
Tembel yükleme yüzünden işler daha kolay hale gelebilir. Eğer Member
bir yüklü explicite bir sorgu olmadan yorum almak gerekir:
var commentsOfMember = member.MemberComments.Select(mc => mc.Comment);
Tembel yükleme arka planda otomatik olarak yorum getirecek sanırım.
Edit
Sadece eğlence varlıkları ve ilişkileri nasıl ekleneceğini ve bu model onları silmek için nasıl: bir kaç örnek daha
1) bir üyesi ve bu üye iki yorum Oluşturun:
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();
2) member1 üçüncü bir yorum Ekleyin:
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) yeni üye Oluşturma ve mevcut comment2 ile ilgili:
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) mevcut member2 ve comment3 arasındaki ilişki Oluşturun:
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) bu ilişkiyi yeniden Sil:
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) yorum member1 ve tüm relationsships Sil:
var member1 = context.Members.Where(m => m.FirstName == "Pete")
.SingleOrDefault();
if (member1 != null)
{
context.Members.Remove(member1);
context.SaveChanges();
}
Bu siler ilişkileri MemberComments
de, çünkü bir-çok ilişkiler arasında Member
MemberComments
arasında Comment
MemberComments
Kur ile basamaklı silme ile sözleşme. Ve bu durumda, çünkü MemberId
CommentId
MemberComment
tespit olarak yabancı anahtar özellikleri Member
Comment
navigasyon özellikleri ve o zamandan beri FK özellikleri türü null olmayan int
ilişki gerektiren nedenler sonunda geçişli-sil-Kur. Bu modelde mantıklı, bence.
Ne zaman pozitif bir tablo kullanmak y...
Nasıl özel ek alanlar oluşturmak için ...
Otomatik oluşturmak SQL Server tablo i...
Hızlı okuma çok büyük bir tablo R data...
OLUŞTURMAK ayrı bir TABLO olmadan SEÇİ...