EF4 - 自定义ObjectContext和继承问题

mhe*_*xon 10 entity-framework

我在上一个问题上进一步展开了.假设我从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; }
}
Run Code Online (Sandbox Code Playgroud)

现在我创建自定义对象上下文:

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; }
}
Run Code Online (Sandbox Code Playgroud)

这给了我以下实际上非常具有描述性的错误消息:

测试方法引发异常:System.ArgumentException:没有为指定的实体类型"BlogEntry"定义EntitySet.如果'BlogEntry'是派生类型,请改用基类型.例如,如果调用CreateObjectSet()并且DiscontinuedProduct是已知实体类型但未直接映射到EntitySet,则会看到此错误.DiscontinuedProduct类型可以是派生类型,其中父类型映射到EntitySet,或者DiscontinuedProduct类型可能根本不映射到EntitySet.参数名称:TEntity

现在我不是继承和东西的主人,但我看到的方式是添加一组条目和注释作为ObjectSet <Post>来解决我的问题?

Ale*_*mes 11

如果ObjectSet为基类型创建(即Post),则也无法为派生类型创建一个,因为您可以从该类继承层次结构中检索所有类型的实例ObjectSet.

ie ctx.Posts.OfType<BlogEntry>()将返回BlogEntry(s).

所以答案是简单地删除另外两组.

如果你需要做一个添加例如你可以这样做:

ctx.Posts.AddObject(new BlogEntry {....});
Run Code Online (Sandbox Code Playgroud)

完全没问题.

为了帮助您更轻松地编写查询,您可以在ObjectContext中添加几个属性,如下所示:

public ObjectQuery<BlogEntity> Blogs{
   get{
       return ctx.Posts.OfType<BlogEntry>() as ObjectQuery<BlogEntry>;
   }
} 
Run Code Online (Sandbox Code Playgroud)

和评论相同.

希望这可以帮助

亚历克斯