2013-10-15 2 views
2

모든 것이 원형 의존성이 될 것처럼 보이는 EF가있는 순환 적 종속과 약간 혼동됩니다. 나는 실제로는 원형엔티티 프레임 워크 코드 첫 번째 순환 규칙

enter image description here

참조 이것에 대해 걱정하지 않나요 것을 볼 않는 Vs2012에서 "코드 맵"을 실행하면 this tutorial

public class Blog 
{ 
    public int BlogId { get; set; } 
    public string Name { get; set; } 

    public virtual List<Post> Posts { get; set; } 
} 

public class Post 
{ 
    public int PostId { get; set; } 
    public string Title { get; set; } 
    public string Content { get; set; } 

    public int BlogId { get; set; } 
    public virtual Blog Blog { get; set; } 
} 

보면

? 나는 Autofixture를 사용하여 더미 데이터를 생성하려했지만 순환 참조 때문에 충돌이 발생합니다.

답변

2

양방향 연관성에 대해 걱정할 필요가 없는지 묻는 질문에 따라 달라집니다. 도메인 중심 디자인에서는 보통 사람들이 걱정해야한다고합니다. 예. 에릭 에반스는 자신의 책 Domain driven design: tackling the complexity in the heart of software에서 가능하다면 피해야한다고 말합니다.

줄리 러먼은 엔티티 프레임 워크는 당신이 포스트에서 블로그와 BlogId 속성을 제거한 경우 어떤 불평하지 말았어야하지만, 다른 더 복잡한이있을 수 있습니다 제공하는 간단한 예에서 최근 포스트 here

의 문제에 대해 기록 사례.

엔티티는 기본적으로 데이터베이스의 게시물 행에 외래 키를 소유 블로그 행에 추가하지만 도메인 모델은 블로그에서 게시물로만 이동할 수 있습니다.

다음 스 니펫은 먼저 데이터베이스에서 첫 번째 블로그를로드 한 다음 해당 블로그의 게시물을 게으른로드합니다.

using (var db = new BlogContext()) 
{ 
    var blog = db.Blogs.FirstOrDefault(); 

    //lazy loading the Posts of the blog that was fetched in previous line   
    foreach (var post in blog.Posts) 
    { 
     Trace.TraceInformation(string.Format("Title of post {0} is {1}", post.Id, post.Title)); 
     } 
    } 
} 

당신이 정말로 게시합니다 때문에 응용 프로그램의 일부 비즈니스 요구 사항, 블로그에 게시물에서하는 블로그에서 모두 이동해야하는 경우에, 당신은 쿼리 및 양방향 관계 사이에서 결정해야합니다. 선택해야하는 것은 완전히 당신에게 달려 있습니다. Entity Framework는 두 가지 모두를 지원합니다.

양방향 연관은 양쪽에 탐색 속성이있어 양방향으로 탐색 할 수있게하는 것입니다. 나는. 블로그에 게시물 속성이 있고 각 게시물에 블로그를 가리키는 Blog 속성이 있으면 양방향 연관성이 있습니다.

다른 옵션은 한쪽에만 탐색 속성을 갖는 것입니다. 예 : 블로그는 게시물 목록을 포함 할 수 있습니다. 이렇게하면 블로그에서 게시물로 이동하는 것이 쉬울 것입니다. 이는 아마도 가장 필요한 것일 것입니다. 일부 유스 케이스에서 게시물에 대한 참조가 있고 해당 블로그가 속한 블로그를 찾으려면 저장소/dbcontext에서 해당 블로그에 게시물이있는 블로그 개체를 검색하여 블로그를 찾을 수 있습니다 게시물 목록.

DDD의 지지자는 종종 반대 방향으로 탐색해야하는 경우 단방향 탐색과 쿼리를 권장합니다.

+0

하지만 두 파일 사이의 연결이 끊어지고 Post.Blog.Id를 더 이상 수행 할 수 없어서 게으른 로딩 (심지어 열심히로드하는 것)이 없어지므로 지금 동일한 작업을 수행하기 위해 별도의 쿼리를 작성해야합니다. 그것이 EF를 제한하지 않는가? 나는 EF에 매우 익숙하며, Nhibernate에서 블로그를 Post에서해야한다는 것을 알고 있습니다. 그렇지 않으면 링크가 결코 일어나지 않을 것입니다. ORM이 마치 도메인에 존재하는 데이터베이스 측에 순환 참조가 없어도이를 강제하는 것처럼 보입니다. – chobo2

+0

양방향로드가 없어도 지연로드가 작동하지 않습니다. 위의 게시물에 예제 코드를 추가했습니다. –

+0

예. 블로그에서 게시물로 이동하는 것이 아니라 블로그에서 게시물로 이동하는 중입니다. 나는 단지 도메인의 다른쪽에 접근 할 수 있도록 사용하고 있으며, Nhibernate에서는 꽤 필수적이라고 말한 것처럼 말입니다. 당신이 말하는 것은 EF에서 필수는 아니지만 아직 시도하지 않았습니다. "... 질의와 양방향 연관성"이란 무엇을 의미합니까? – chobo2