EF4 - пользовательский ObjectContext и вопрос наследования - PullRequest
10 голосов
/ 29 мая 2009

Вращаясь далее на предыдущий вопрос У меня был. Допустим, я наследую BlogEntry и Comment от поста. Теперь я хочу немного их настроить. Для комментария к сообщению в блоге заголовок не нужен, но для комментария нужна ссылка на пользователя, поэтому я переместил эти два поля из сообщения в запись и запись в блоге следующим образом:

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

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

1 Ответ

11 голосов
/ 29 мая 2009

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

т.е. ctx.Posts.OfType<BlogEntry>() вернет BlogEntry (s).

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

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

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

вообще никаких проблем.

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

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

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

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

Alex

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...