사용자 정의 된 조인 테이블을 사용하여 다 대다 관계를 작성할 수 없습니다. 다 대다 관계에서 EF는 내부 및 조인 테이블을 관리합니다. 모델에 Entity 클래스가없는 테이블입니다. 추가 속성이있는 조인 테이블을 사용하려면 실제로 두 대 일 관계를 만들어야합니다. 다음과 같이 보일 수 있습니다 :
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
예를 들어 = "Smith" 로 멤버의 모든 주석을 찾으려면 다음과 같은 쿼리를 작성할 수 있습니다.
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();
또는 "Smith"라는 이름을 가진 멤버 목록을 만들려면 (둘 이상 있다고 가정) 투영을 사용할 수 있습니다.
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();
이제 조인 테이블의 속성을 기준으로 필터링 할 수 있습니다 (다 대다 관계에서는 불가능). 예 : 속성이 99 인 멤버 1의 모든 주석 필터링 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);
게으른 로딩은 자동으로 주석을 자동으로 가져옵니다.
편집하다
재미있게 몇 가지 예를 들어 엔티티와 관계를 추가하는 방법과이 모델에서 관계를 삭제하는 방법이 더 있습니다.
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();
2) member1의 세 번째 주석을 추가하십시오.
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) member1과 주석과의 모든 관계를 삭제하십시오.
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
in 및 및 탐색 MemberComment
속성에 대한 외래 키 속성으로 감지되고 FK 속성이 Null을 허용하지 않는 유형이기 때문에 결국 계단식 삭제 삭제를 일으키는 관계가 필요합니다. 이 모델에서는 의미가 있다고 생각합니다.Member
Comment
int