SORU
13 AĞUSTOS 2011, CUMARTESİ


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
13 AĞUSTOS 2011, CUMARTESİ


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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Blendtec

    Blendtec

    30 EKİM 2006
  • nigahiga

    nigahiga

    21 Temmuz 2006
  • thelonelyisland

    thelonelyisl

    23 Aralık 2005