EF4 - 自定义ObjectContext和继承问题

时间:2009-05-28 21:33:53

标签: entity-framework

在我previous question上进一步旋转。假设我从Post继承了BlogEntry和Comment。我现在想要自定义它们。对博客文章的评论不需要标题,但评论需要用户参考,所以我将这两个字段从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:有   没有定义的EntitySets   指定的实体类型'BlogEntry'。如果   'BlogEntry'是派生类型,使用   基类型代替。例如,你   如果你打电话会看到这个错误   CreateObjectSet()   和DiscontinuedProduct是众所周知的   实体类型但不直接映射   到一个EntitySet。该   DiscontinuedProduct类型可能是a   父类型所在的派生类型   映射到EntitySet或   DiscontinuedProduct类型可能不是   完全映射到EntitySet。   参数名称:TEntity

现在我不是继承和东西的主人,但我看到的方法是添加一组条目和注释作为ObjectSet&lt;交&GT;这会解决我的问题吗?

1 个答案:

答案 0 :(得分:11)

如果为基本类型(即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>;
   }
} 

和评论相同。

希望这有帮助

亚历