2009-05-28 10 views
10

Girando más lejos en el previous question que tenía. Digamos que heredo BlogEntry y Comment from Post. Ahora quiero personalizarlos un poco. Un comentario a un post no necesita un título, pero un comentario necesita una referencia para el usuario, así que mover estos dos campos hacia fuera del poste y en el comentario y el blog de entrada como esta:EF4 - Pregunta de ObjectContext y herencia personalizada

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

Ahora puedo crear mi contexto objeto personalizado :

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

Esto me da el siguiente mensaje de error en realidad bastante descriptiva:

método de ensayo arrojó excepción: System.ArgumentException : Hay no EntitySets definido para el tipo de entidad especificada 'BlogEntry'. Si 'BlogEntry' es un tipo derivado, use el tipo de base en su lugar. Por ejemplo, vería este error si llamó a CreateObjectSet() y DiscontinuedProduct es un tipo de entidad conocido pero no se ha correlacionado directamente con a un EntitySet. El tipo de producto descontinuado puede ser un tipo derivado donde el tipo principal es asignado a EntitySet o el tipo descontinuado puede no ser asignado a un EntitySet en absoluto. Nombre Parámetro: TEntity

Ahora no soy un maestro de la herencia y esas cosas, pero mi forma de ver esto sería añadir un conjunto de entradas y comentarios como ObjectSet < publicación> que resolvería mis problemas?

Respuesta

11

Si crea una ObjectSet para un tipo de base (es decir Post) no se puede crear una para tipos derivados también, porque se puede recuperar instancias de todos los tipos en la jerarquía de herencia de que uno ObjectSet.

es decir, ctx.Posts.OfType<BlogEntry>() devolvería BlogEntry (s).

Así que la respuesta es simplemente eliminar los otros dos conjuntos.

Si yo tiene que hacer un complemento, por ejemplo, se puede hacer esto:

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

ningún problema en absoluto.

para ayudarle a escribir consultas más fácilmente que probablemente se podría añadir un par de propiedades a su ObjectContext que se parecen a esto:

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

y lo mismo para los comentarios.

Esperanza esto ayuda

Alex

+0

tiempo Sí No he tenido que mirar más lejos. Lo que dices suena cierto. Acabo de terminar de escribir una gran publicación en el blog sobre mis hallazgos de hoy. Parece que tengo que escribir otro mañana sobre la herencia de POCO :) – mhenrixon

+0

¡Gracias por la sugerencia de quitar el bagage! :) – mhenrixon