5

Al ejecutar mi primera aplicación asp.net mvc, recibí este error . ¿Creía que el marco de entidad crearía automáticamente las claves de los nombres de columna que terminan con Id? ¿no es correcto?EntityType 'ApplicantPosition' no tiene una clave definida

Como puede ver, el ApplicantPositionID sería una tabla con 2 columnas como clave principal porque se relacionaría con los solicitantes y también con Position. Se detectaron

Uno o más errores de validación durante la generación del modelo:

System.Data.Edm.EdmEntityType: : EntityType 'ApplicantImage' has no key defined. Define the key for this EntityType. 
System.Data.Edm.EdmEntityType: : EntityType 'ApplicationPositionHistory' has no key defined. Define the key for this EntityType. 
System.Data.Edm.EdmEntitySet: EntityType: EntitySet �ApplicantsPositions� is based on type �ApplicantPosition� that has no keys defined. 
System.Data.Edm.EdmEntitySet: EntityType: EntitySet �ApplicantImages� is based on type �ApplicantImage� that has no keys defined. 
System.Data.Edm.EdmEntitySet: EntityType: EntitySet �ApplicationsPositionHistory� is based on type �ApplicationPositionHistory� that has no keys defined. 

El error se lanza en esta línea:

public ActionResult Index() 
     { 
      return View(db.Positions.ToList()); 
     } 

Y mi modelo es el siguiente:

namespace HRRazorForms.Models 
{ 



    public class Position 
    { 
     public int PositionID { get; set; } 
     [StringLength(20, MinimumLength=3)] 
     public string name { get; set; } 
     public int yearsExperienceRequired { get; set; } 
     public virtual ICollection<ApplicantPosition> applicantPosition { get; set; } 
    } 

    public class Applicant 
    { 
     public int ApplicantId { get; set; } 
     [StringLength(20, MinimumLength = 3)] 
     public string name { get; set; } 
     public string telephone { get; set; } 
     public string skypeuser { get; set; } 
     public ApplicantImage photo { get; set; } 
     public virtual ICollection<ApplicantPosition> applicantPosition { get; set; } 

    } 

    public class ApplicantPosition 
    { 
     public int ApplicantID { get; set; } 
     public int PositionID { get; set; } 
     public virtual Position Position { get; set; } 
     public virtual Applicant Applicant { get; set; } 
     public DateTime appliedDate { get; set; } 
     public int StatusValue { get; set; } 

     public Status Status 
     { 
      get { return (Status)StatusValue; } 
      set { StatusValue = (int)value; } 
     } 

     //[NotMapped] 
     //public int numberOfApplicantsApplied 
     //{ 
     // get 
     // { 
     //  int query = 
     //    (from ap in Position 
     //    where ap.Status == (int)Status.Applied 
     //    select ap 
     //     ).Count(); 
     //  return query; 
     // } 
     //} 
    } 




    public class ApplicantImage 
    { 
     public int ApplicantId { get; private set; } 
     public byte[] Image { get; set; } 
    } 

    public class Address 
    { 
     [StringLength(20, MinimumLength = 3)] 
     public string Country { get; set; } 
     [StringLength(20, MinimumLength = 3)] 
     public string City { get; set; } 
     [StringLength(20, MinimumLength = 3)] 
     public string AddressLine1 { get; set; } 
     public string AddressLine2 { get; set; }  
    } 



    public class ApplicationPositionHistory 
    { 
     public ApplicantPosition applicantPosition { get; set; } 
     public Status oldStatus { get; set; } 
     public Status newStatus { get; set; } 
     [StringLength(500, MinimumLength = 10)] 
     public string comments { get; set; } 
     public DateTime dateModified { get; set; } 
    } 

    public enum Status 
    { 
     Applied, 
     AcceptedByHR, 
     AcceptedByTechnicalDepartment, 
     InterviewedByHR, 
     InterviewedByTechnicalDepartment, 
     InterviewedByGeneralManager, 
     AcceptedByGeneralManager, 
     NotAccepted 
    } 



} 

Respuesta

11

El código EF Primero solo puede inferir que una propiedad es una clave primaria si la propiedad se llama Id o <class name>Id (o si está anotada con el atributo de clave). Así que debe extender su p. Ej. ApplicantImage con una propiedad ApplicantImageId o Id etc.

Editar: Una artice sobre los coneventions: Conventions for Code First

+1

Moví la imagen a la clase solicitante porque no quería crear una tabla para ella. Y puse explícitamente [Key] donde sea necesario. ahora funciona bien Gracias –

2

Puedes añadir el atributte [Key] a la propiedad ApplicantId o hacerlo a través de la API Fluido anulando OnModelCreating método DbContext

modelBuilder.Entity<ApplicantImage >().HasKey(p => p.ApplicantId); 
1

En su caso, la convención de nomenclatura de EF busca primero una columna de ID (no distingue entre mayúsculas y minúsculas). Si nada, busca ApplicantImageId y cuando no encuentra nada, genera ese error.

Por lo tanto, se debe añadir el atributo [Key] en su identificación:

public class ApplicantImage 
{ 
    [Key] 
    public int ApplicantId { get; private set; } 
    public byte[] Image { get; set; } 
} 

y si ApplicantId columna es la identidad en su base de datos, debe agregar otro atributo también:

public class ApplicantImage 
{ 
    [Key] 
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
    public int ApplicantId { get; private set; } 
    public byte[] Image { get; set; } 
} 
0

I Sé que esta es una vieja pregunta, pero sigue siendo relevante. Me encontré con la misma situación, sin embargo usamos un archivo .tt para generar los .cs de nuestro edmx. Nuestro .tt está configurado para agregar el atributo [Key] en nuestra primera columna de la tabla para la mayoría de las situaciones, pero en mi caso estaba usando una fila over() en SQL para generar identificadores únicos para la primera columna (funciona muy bien para la mayoría situaciones). El problema con eso fue que hace una nullable y el .tt no estaba configurado para agregar [Key] en este caso.

Envolviendo la fila Sobre() en un ISNULL ((), 0) pude arreglar la columna no nula y resolví mi problema. De lo contrario, como menciona marianosz, simplemente usar la .HasKey() en su contexto de datos también funcionará bien.

Cuestiones relacionadas