2009-05-28 33 views
10

Quay thêm trên previous question Tôi đã có. Giả sử tôi kế thừa BlogEntry và Nhận xét từ bài đăng. Bây giờ tôi muốn tùy chỉnh chúng một chút. Một bình luận cho một bài đăng blog không cần một danh hiệu nhưng một lời nhận xét cần có một tài liệu tham khảo sử dụng vì vậy tôi di chuyển hai lĩnh vực này ra khỏi Bưu chính, vào Comment và Blog entry như thế này:EF4 - tùy chỉnh ObjectContext và câu hỏi thừa kế

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; } 
} 

Bây giờ tôi có thể tạo bối cảnh đối tượng tùy chỉnh của tôi :

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; } 
} 

này mang lại cho tôi thực sự sau thông báo lỗi khá mô tả:

phương pháp thử ném ngoại lệ: System.ArgumentException: có no EntitySets được định nghĩa cho loại thực thể được chỉ định 'BlogEntry'. Nếu 'BlogEntry' là loại có nguồn gốc, hãy sử dụng loại cơ sở thay thế. Ví dụ: bạn sẽ thấy lỗi này nếu bạn gọi là CreateObjectSet() và Ngừng sản phẩm là một loại thực thể được biết là nhưng không được ánh xạ trực tiếp cho một EntitySet. Loại Ngưng sản phẩm có thể là loại có nguồn gốc, trong đó loại gốc là ánh xạ tới EntitySet hoặc Loại sản phẩm bị gián đoạn có thể không được ánh xạ tới một EntitySet. Tên Parameter: TEntity

Bây giờ tôi không phải là một bậc thầy về thừa kế và các công cụ nhưng cách tôi thấy điều này sẽ có thêm một bộ Entries và Bình luận như ObjectSet < bài viết> rằng sẽ giải quyết vấn đề của tôi?

Trả lời

11

Nếu bạn tạo ObjectSet cho loại cơ sở (ví dụ: Post), bạn không thể tạo một loại cho các loại dẫn xuất, vì bạn có thể truy xuất các thể hiện của tất cả các loại trong hệ thống phân cấp thừa kế từ số ObjectSet.

tức là ctx.Posts.OfType<BlogEntry>() sẽ trả lại (các) BlogEntry.

Vì vậy, câu trả lời là chỉ cần xóa hai bộ còn lại.

Nếu yo cần phải làm một add ví dụ bạn có thể làm điều này:

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

không có vấn đề gì cả.

Để giúp bạn viết các truy vấn một cách dễ dàng hơn, bạn có thể có thể thêm một vài tính để ObjectContext của bạn trông như thế này:

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

và cùng để lấy ý kiến.

Hope this helps

Alex

+0

thời gian Vâng tôi đã không phải bất lực nhìn vào nó hơn nữa. Những gì bạn nói có vẻ đúng. Tôi vừa viết xong một bài đăng trên blog khổng lồ về những phát hiện của tôi hôm nay. Có vẻ như tôi phải viết một cái khác vào ngày mai về thừa kế của POCO :) – mhenrixon

+0

Cảm ơn bạn đã chỉ cần bỏ túi! :) – mhenrixon

Các vấn đề liên quan