在我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;这会解决我的问题吗?
答案 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>;
}
}
和评论相同。
希望这有帮助
亚历