6

Estoy utilizando primero el código de Entity Framework 4.1 y ASP.NET MVC 3 y estoy luchando para obtener mi configuración de autorreferencia correctamente. Tengo una clase de categoría. Debe autoreferenciarse a sí mismo. Una categoría puede ser una categoría principal cuando ParentCategoryId en la tabla es nulo. Si una categoría tiene un ParentCategoryId con un valor, significa que pertenece a una categoría principal.Entity Framework 4.1 Recuperación de datos de referencia automática

Seguí esto article en Code Project.

Aquí es mi clase Categoría:

public class Category 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public string Description { get; set; } 
    public string MetaKeywords { get; set; } 
    public string MetaDescription { get; set; } 
    public bool IsActive { get; set; } 
    public virtual Category ParentCategory { get; set; } 
    public int? ParentCategoryId { get; set; } 
} 

Mi clase de contexto:

public class PbeContext : DbContext 
{ 
    public DbSet<Category> Categories { get; set; } 

    protected override void OnModelCreating(DbModelBuilder dbModelBuilder) 
    { 
      dbModelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); 

      dbModelBuilder.Entity<Category>() 
       .HasOptional(c => c.ParentCategory) 
       .WithMany() 
       .HasForeignKey(p => p.ParentCategoryId); 
    } 
} 

No estoy seguro si lo anterior es correcto?

¿Alguien puede ayudarme a hacer esto bien? Lo que necesito es que cuando consulto una categoría por identificación, debe devolver la categoría principal (solo se carga cuando es necesario). También debe cargar cualquier categoría hija (solo cuando sea necesario). Todavía no he agregado una lista a la clase de categoría para las categorías secundarias.

¿Cómo se verían las preguntas anteriores para recuperar una categoría con categoría padre e categorías secundarias?

EDITAR

Así es como puedo recuperar mi categoría:

public Category GetById(int id) 
{ 
    return db 
      .Categories 
      .Find(id); 
} 

Debido a la referencia ParentCategory puede ser nulo, ¿cómo iba a mostrar este en la vista? Tengo el siguiente:

@Model.ParentCategory.Name 

..pero no se dará un error si la categoría no tiene ninguna categoría padre asociada a ella? ¿Cómo lo mostraría en la vista?

Respuesta

7

Si necesita acceder a categorías secundarias se puede añadir una propiedad de colección a su modelo

public class Category 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public string Description { get; set; } 
    public string MetaKeywords { get; set; } 
    public string MetaDescription { get; set; } 
    public bool IsActive { get; set; } 
    public virtual Category ParentCategory { get; set; } 
    public int? ParentCategoryId { get; set; } 
    public virtual ICollection<Category> ChildCategories{ get; set; } 
} 

A continuación, se puede configurar el modelo como

 dbModelBuilder.Entity<Category>() 
      .HasOptional(c => c.ParentCategory) 
      .WithMany(c => ChildCategories) 
      .HasForeignKey(p => p.ParentCategoryId); 

Editar

Usted debe compruebe si ParentCategory es nulo o no.

@if(Model.ParentCategory != null){ 
    <div>@Model.ParentCategory.Name</div> 
} 
+0

Gracias. ¿Cómo sería su consulta para recuperar los datos? –

+0

Por favor, vea mi publicación editada :) –

+0

@Brendan editó la respuesta – Eranga

Cuestiones relacionadas