EF4 - пользовательский объект ObjectContext и вопрос наследования

Скручиваясь дальше на предыдущем вопросе, я имел. Скажем, я наследую BlogEntry и Comment from Post. Теперь я хочу немного их настроить. Комментарий к сообщению в блоге не нуждается в заголовке, но комментарий требует ссылки на пользователя, поэтому я переношу эти два поля из сообщения "Почта" и "Комментарий" и "Блога" следующим образом:

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: есть нет EntitySet, определенных для указанный тип объекта "BlogEntry". Если "BlogEntry" - это производный тип, используйте базовый тип. Например, вы будет видеть эту ошибку, если вы позвонили CreateObjectSet() и DiscontinuedProduct является известным тип объекта, но не отображается напрямую к EntitySet. Discontinued Тип продукта может быть производный тип, где родительский тип сопоставлены с EntitySet или Discontinued Тип продукта может не быть сопоставлены с EntitySet вообще. Имя параметра: TEntity

Теперь я не мастер наследования и прочее, но, как я вижу, это будет добавить набор записей и комментариев как ObjectSet <Post> , что бы решить мои проблемы?

Ответ 1

Если вы создаете ObjectSet для базового типа (т.е. Post), вы также не можете создать его для производных типов, потому что вы можете извлекать экземпляры всех типов в иерархии наследования из этого ObjectSet.

то есть. ctx.Posts.OfType<BlogEntry>() будет возвращать объекты BlogEntry.

Итак, ответ состоит в том, чтобы просто удалить другие два набора.

Если вам нужно сделать дополнение, например, вы можете сделать это:

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

нет проблем.

Чтобы легче писать запросы, вы, вероятно, могли бы добавить несколько свойств в ObjectContext, которые выглядят следующим образом:

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

и то же самое для комментариев.

Надеюсь, что это поможет

Алекс