2009-05-29 2 views
0

나는 이것이 내가 왜 상속 문제에 대한 Alex의 제안을 시도하기 위해 블로그 항목을 추가하기 위해 UnitTest를 만들었는지를 이해한다고 생각하더라도 재미 있어야합니다. 이제 나는 다른 것을 발견한다. EF4 - 블로그 항목을 추가하면 프로필에 대한 불만이 있습니까?

[TestMethod] 
public void UserCanAddBlogEntry() 
{ 
    var context = new EntityContext(Options.LazyLoading); 

    var user = (from u in context.Users 
        .Include("Blog.BlogEntries") 
       where u.Id == 1 
       select u).FirstOrDefault(); 

    BlogEntry entry = new BlogEntry(); 
    entry.Header = "Test Entry"; 
    entry.Text = "Test Text blah blah blah"; 
    entry.CreatedAt = DateTime.Now; 
    entry.Blog = user.Blog; 

    user.Blog.BlogEntries.Add(entry); 
    context.SaveChanges(); 

    Assert.IsTrue(user.Blog.BlogEntries.Count > 0); 
} 

예외 원인 :

실패 UserCanAddBlogEntry Zirzle.UnitTests
시험 방법 UserCanAddBlogEntry 던졌다 예외 : System.InvalidOperationException : 탐색 속성 '사용자'의 검출 잘못된 관계 픽스 'Profile'유형의 엔티티

이 사진에 어떤 문제가 있는지 잘 모릅니다. get .Include ("Profile")를 get 쿼리에 추가하면 변경 사항을 저장하지 않아 더 이상 불평하지 않습니다. 프로필에 대해 0.1의 관계 끝을 추가하려고했지만 어느 쪽도 효과가 없습니다. 어떤 제안? 나는 스택 오버플로가 개인 EF 전문가가 설명을 가지고 있을지도 모른다고 생각한다. :)

답변

1

이것은 흥미 롭다.

내가 Blog.BlogEntriesBlogEntry.Blog

나는 또한 모든 클래스의 모든 속성을 가상 있다고 믿고있어의 반전이 있으리라 믿고있어, 그래서 EF 프록시 클래스를 할 수 있습니다.

당신이 그 (것)들에게 직접 만든 때문에 ObjectContext 그들을 건설하고 일부는 (entry)를 프록시되지 않기 때문에 일부 개체는 (useruser.Blog) 프록시됩니다 이러한 가정을 감안할 때.

프록시 클래스는 자동으로 수정 업, 즉 동기화 관계의 양쪽 끝을 유지 할

그래서 프록시 user.Blog에이 일을 : 자동으로 user.Blogentry.Blog을 설정합니다

user.Blog.BlogEntries.Add(entry) 

같은 시간에 두 관계가 모두 동기화됩니다. 한편

entry가 프록시되지 않기 때문에이 :

entry.Blog = user.Blog 

는 변경 수정하지 않습니다.

이 코드에서 본질적으로 수정판의 절반을 두 번하고 있습니다. 우리는 아마도이 상황을 정상적으로 처리해야하지만 분명히 그렇지 않습니다. 나는 팀과 이야기 할 것입니다.

난 당신을 제안하는 모든 뭔가 좀 더 간단 할 말해 두 겠는데 :

// notice there is no need to get the User just the users blog 
var blog = (from u in context.Users 
      where u.Id == 1 
      select u.Blog).Single(); 

그냥 이렇게 :

BlogEntry entry = new BlogEntry(); 
entry.Header = "Test Entry"; 
entry.Text = "Test Text blah blah blah"; 
entry.CreatedAt = DateTime.Now; 
entry.Blog = blog; 
//because BlogEntry inherits from Post if I remember your model 
context.Posts.Add(entry); 
context.SaveChanges(); 

이 작동합니다.

알렉스

+0

귀하의 모든 가정은 옳았습니다. 그러나 여전히 제안을 사용하여 픽스 업에 문제가 발생합니다. 테스트 메소드 UserCanAddBlogEntry가 예외를 throw했습니다. System.InvalidOperationException : 'BlogEntries'유형의 엔터티 탐색 속성 'BlogEntries'에서 유효하지 않은 관계 픽스 업이 감지되었습니다. – mhenrixon

+0

음 ... 나는 지금 당황스러워. 대신 entry.Blog = blog blog.BlogEntries.Add (입력)을 시도하면 어떻게되는지 알려주세요. –

+0

나는 한 가지를 제외하고 제안했다. 내가 방법을 AddEntry (항목 항목) 그냥 ILIST poco 게시물 ado.net 블로그에서 권장하는 항목을 추가 할 만들었습니다. 나중에 User 클래스에 있어야합니다. 두 가지 문제가 있습니다. 문제 해결을 제안하는 것이 좋습니다. 코멘트에서 제안한 것을 수행하면 nullreference 예외가 발생합니다. 나는 그것이 일종의 문제를 만드는 프록시라고 생각하지만 심각하게도 그것이 버그인지는 모르겠다. 나는 그것이 나에게 말해주는 나 자신을 돌볼 수 있다고 말했다. 나는 어쨌든 이런 식으로 문맥을 폭로하지 않을 것이다. – mhenrixon

관련 문제