2009-05-28 3 views
10

previous question에 대한 자세한 내용을 알고 싶습니다. 블로그에서 BlogEntry와 Comment를 상속 받았다고 가정 해 보겠습니다. 나는 이제 그것들을 약간 사용자 화하고 싶다.EF4 - 사용자 정의 ObjectContext 및 상속 질문

public abstract class Post 
{ 
    public virtual int Id { get; set; } 
    public virtual string Text { get; set; } 
    public virtual DateTime CreatedAt { get; set; } 
} 

public class BlogEntry : Post 
{ 
    public virtual string Header { get; set; } 
    public virtual Blog Blog { get; set; } 
    public virtual IEnumerable<Comment> Comments { get; set; } 
} 

public class Comment : Post 
{ 
    public virtual string Header { get; set; } 
    public virtual int UserId { get; set; } 
    public virtual BlogEntry BlogEntry { get; set; } 
} 

지금 내 사용자 정의 개체 컨텍스트를 만들 :이 같은 항목을 포스트에서와 코멘트에이 두 필드를 이동하고 블로그 있도록 블로그 게시물에 대한 의견은 제목을 필요로하지 않지만 코멘트는 사용자 참조를 필요로 :

public class EntityContext : System.Data.Objects.ObjectContext 
{ 
    public EntityContext() : base("name=Entities", "Entities") 
    { 
     this.Blogs = CreateObjectSet<Blog>(); 
     this.Posts = CreateObjectSet<Post>(); 
     this.Entries = CreateObjectSet<BlogEntry>(); 
     this.Comments = CreateObjectSet<Comment>(); 
    } 
    public ObjectSet<Blog> Blogs { get; set; } 
    public ObjectSet<Post> Posts { get; set; } 
    public ObjectSet<BlogEntry> Entries { get; set; } 
    public ObjectSet<Comment> Comments { get; set; } 
} 

이 꽤 설명이 포함 된 오류 메시지 실제로 다음 날 제공 :

시험 방법 던진 예외 : System.ArgumentException :,691를있다지정된 엔터티 유형 'BlogEntry'에 대해 에 대해 정의 된 EntitySet이 없습니다. 'BlogEntry'가 파생 유형 인 경우 기본 유형을 대신 사용하십시오. 예를 들어 은 CreateObjectSet() 을 호출하고 DiscontinuedProduct가 알려진 엔티티 유형이지만 바로 으로 EntitySet에 매핑되지 않은 경우이 오류가 표시됩니다. DiscontinuedProduct 유형은 부모 유형이 이 EntitySet으로 매핑되거나 DiscontinuedProduct 유형이 EntitySet에 전혀 매핑되지 않은 인 파생 유형 인 파생 유형 일 수 있습니다. 매개 변수 이름 : TEntity 이제

나는 생각하지 상속 및 물건하지만이 내 문제를 해결하는 것입니다 ObjectSet < 포스트> 같은 항목과 댓글의 세트를 추가하는 것입니다 보는 방식의 마스터?

답변

11

당신은 기본 유형 (즉 Post)는 하나 ObjectSet에서 상속 계층 구조에서 모든 유형의 인스턴스를 검색 할 수 있기 때문에 당신이 너무 파생 유형을 만들 수 없습니다에 대한 ObjectSet을 만드는 경우.

ctx.Posts.OfType<BlogEntry>()은 BlogEntry를 반환합니다.

그럼 답은 단순히 다른 두 세트를 제거하는 것입니다.

요 당신이 할 수있는 예를 들어 추가 할 필요가있는 경우 : 모든

ctx.Posts.AddObject(new BlogEntry {....}); 

아무 문제입니다.

public ObjectQuery<BlogEntity> Blogs{ 
    get{ 
     return ctx.Posts.OfType<BlogEntry>() as ObjectQuery<BlogEntry>; 
    } 
} 

과 의견에 대해 동일합니다 :

당신은 아마 다음과 같이 당신의 ObjectContext는에 몇 가지 속성을 추가 할 수 있습니다 더 쉽게 쿼리를 작성 도움이됩니다.

희망이

알렉스

+0

에게 더 그것을 보는 그래 내가 가진하지 않은 시간을하는 데 도움이됩니다. 당신이 말하는 것은 사실로 들립니다. 나는 방금 나의 발견에 관해 거대한 blog 지위를 오늘 작성하는 것을 끝내었다. 내가 POCO 상속에 대해 내일 또 다른 하나를 써야하는 것처럼 본다. – mhenrixon

+0

단지 bagage를 제거하는 것에 감사드립니다! :) – mhenrixon