代码之家  ›  专栏  ›  技术社区  ›  mhenrixon

EF4-自定义对象上下文和继承问题

  •  10
  • mhenrixon  · 技术社区  · 15 年前

    进一步旋转 previous question 我有过。比如说,我继承了《邮报》的金碧辉煌和评论。我现在想定制一下。对博客文章的评论不需要标题,但评论需要用户引用,因此我将这两个字段从“文章”移到“评论”和“博客”中,如下所示:

    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”是派生类型,请使用 而是基类型。例如,您 如果您调用 创建对象集() 中断的产品是已知的 实体类型,但未直接映射 到实体集。这个 中断的产品类型可以是 父类型为的派生类型 映射到EntitySet或 中止的产品类型可能不是 完全映射到EntitySet。 参数名称:Tentity

    现在,我不是继承和东西的大师,但我认为这将是添加一组条目和注释作为objectset<post>来解决我的问题?

    1 回复  |  直到 15 年前
        1
  •  11
  •   Alex James    15 年前

    如果您创建一个 ObjectSet 对于基本类型(即 Post )您也不能为派生类型创建一个,因为您可以从该派生类型中检索继承层次结构中所有类型的实例。 对象集 .

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

    评论也是如此。

    希望这有帮助

    亚历克斯