5

Podczas uruchamiania mojej pierwszej aplikacji mvc asp.net otrzymałem ten błąd Myślałem, że struktura encji automatycznie utworzyłaby klucze nazw kolumn, które kończą się na Id? czy to nie jest poprawne?EntityType 'ApplicantPosition' nie ma zdefiniowanego klucza

Jak widać, Identyfikator WnioskuPozycja byłaby tabelą z 2 kolumnami jako kluczem podstawowym, ponieważ dotyczyłaby Wnioskodawców, a także Pozycji. wykryto podczas generacji modelu

Jeden lub więcej błędów walidacji

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. 

Błąd jest generowany w tym wierszu:

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

A mój model jest następujący:

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 
    } 



} 

Odpowiedz

11

Kod EF Najpierw można tylko wywnioskować, że właściwość jest kluczem podstawowym , jeśli właściwość nazywa się Id lub <class name>Id (lub jest opatrzona adnotacją z atrybutem Klucz). Musisz więc przedłużyć swój ApplicantImage z własności ApplicantImageId lub identyfikator itp

Edit: AN artice o coneventions: Conventions for Code First

+1

Przenieśliłem obraz do klasy wnioskodawcy, ponieważ nie chciałem stworzyć dla niego tabeli. I umieściłem wyraźnie [Klucz] w razie potrzeby. teraz działa dobrze. dzięki –

2

Możesz dodać [Key] atributte do nieruchomości ApplicantId lub zrobić to poprzez Fluent API nadrzędnymi OnModelCreating metody DbContext

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

W twoim przypadku, konwencja nazewnictwa EF najpierw szuka kolumny (niewrażliwe na wielkość) ID. Jeśli nic, szuka ApplicantImageId, a gdy niczego nie znajdzie, to podnosi ten błąd.

Tak, należy dodać [Key] atrybut na ID:

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

a jeśli ApplicantId kolumna tożsamości w bazie danych, należy dodać kolejny atrybut też:

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

I wiem, że to stare pytanie, ale wciąż jest istotne. Wpadłem na tę samą sytuację, jednak używamy pliku .tt do wygenerowania .cs z naszego edmx. Nasz .tt jest skonfigurowany do dodawania atrybutu [Key] w naszej pierwszej kolumnie tabeli dla większości sytuacji, ale w moim przypadku użyłem wiersza over() w SQL, aby wygenerować unikalny id dla pierwszej kolumny (działa świetnie dla większości sytuacje). Problem polegał na tym, że czyni to zerowalnym, a .tt nie był skonfigurowany do dodawania [Key] w tym przypadku.

Owijanie wiersza Over() w ISNULL ((), 0) było w stanie naprawić, ponieważ kolumna nie jest pusta i rozwiązał mój problem. W przeciwnym razie, jak wspomniał marianosz, po prostu użyjemy .HasKey() w twoim kontekście danych również zadziała dobrze.

Powiązane problemy