EntityType 'ApplicantPosition' hat keine Schlüssel definiert
Beim laufen meinen ersten asp.net mvc-Anwendung bekam ich diese Fehlermeldung
Ich dachte, dass entity framework automatisch erstellen würde, die Schlüssel-Spalte-Namen mit der Id? ist es nicht richtig?
Wie Sie sehen können die ApplicantPositionID wäre eine Tabelle mit 2 Spalten als primary key, denn es würde sich auf die Bewerber und auch zu Positionieren.
Einen oder mehrere Fehler bei der Validierung festgestellt wurden, während Modell-generation:
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.
Den Fehler in dieser Zeile:
public ActionResult Index()
{
return View(db.Positions.ToList());
}
Und mein Modell ist das folgende:
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
}
}
InformationsquelleAutor Luis Valencia | 2011-10-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
EF Code First können nur folgern, dass eine Eigenschaft eine Primärschlüssel, wenn die Eigenschaft aufgerufen wird
Id
oder<class name>Id
(oder, wenn es versehen mit dem Key-Attribut).So müssen Sie erweitern Ihr z.B. ApplicantImage mit einem ApplicantImageId oder der Id-Eigenschaft usw.
Edit: Ein Artikel über die coneventions: Konventionen für Code First
InformationsquelleAutor nemesv
Können Sie die
[Key]
atributte auf die EigenschaftApplicantId
oder über die Fluent-API überschreiben OnModelCreating Methode DbContextInformationsquelleAutor marianosz
In Ihrem Fall, EF Namenskonvention sieht zunächst für eine ID (case-insensitive) Spalte. Wenn nichts, sieht für
ApplicantImageId
und wenn es gründet nichts, es wirft den Fehler zu finden.So, sollten Sie den [Key] - Attribut auf Ihrer ID:
und wenn
ApplicantId
Spalte ist Identität in Ihrer Datenbank haben, sollten Sie ein anderes Attribut zu:InformationsquelleAutor Amin Saqi
Ich weiß, das ist eine alte Frage, aber es ist immer noch relevant. Ich lief in der gleichen situation, aber wir verwenden ein .tt-Datei zu generieren .cs aus unsere edmx. Unsere .tt-setup ist fügen Sie den [Key] - Attribut auf unsere ersten Spalte der Tabelle für die meisten Situationen, aber in meinem Fall war ich mit einer Reihe über () in SQL zu generieren eindeutige id für die erste Spalte (funktioniert gut für die meisten Situationen). Das problem mit, dass war, macht es eine null und die .tt war nicht setup hinzufügen [Taste] in diesem Fall.
Einwickeln der Zeile Über() in einem ISNULL ((),0) in der Lage war, zu beheben, machen Sie die Spalte nicht null ist und mein problem gelöst. Ansonsten, wie erwähnt, durch marianosz, einfach mit dem .HasKey() in dein data-Kontext wird die Arbeit auch in Ordnung.
InformationsquelleAutor RobDigital