EntityType 'ApplicantPosition' не определен ключ - PullRequest
5 голосов
/ 14 октября 2011

При запуске моего первого приложения asp.net mvc я получил эту ошибку Я думал, что структура сущностей автоматически создаст ключи имен столбцов, которые заканчиваются на Id? это не правильно?

Как вы можете видеть, ApplicantPositionID будет таблицей с 2 ​​столбцами в качестве первичного ключа, поскольку он будет относиться к кандидатам, а также к позиции.

Одна или несколько ошибок проверки были обнаружены во время генерации модели:

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.

В этой строке выдается ошибка:

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

И моя модель следующая:

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
    }



}

Ответы [ 4 ]

11 голосов
/ 14 октября 2011

EF Code First может сделать вывод, что свойство является первичным ключом , если свойство называется Id или <class name>Id (или если оно аннотировано атрибутом Key).Поэтому вам необходимо расширить, например, свой объект ApplicantImage с помощью свойства ApplicantImageId или Id и т. Д.

Редактировать: статья о соглашениях: Условные обозначения для Code First

2 голосов
/ 20 октября 2011

Вы можете добавить атрибут [Key] к свойству ApplicantId или сделать это через Fluent API, переопределяя метод OnModelCreating DbContext

modelBuilder.Entity<ApplicantImage >().HasKey(p => p.ApplicantId);
1 голос
/ 19 июля 2013

В вашем случае соглашение об именовании EF сначала ищет столбец ID (без учета регистра).Если ничего не происходит, выполняется поиск ApplicantImageId, а когда ничего не происходит, возникает эта ошибка.

Итак, вы должны добавить атрибут [Key] в свой идентификатор:

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

, и еслиСтолбец ApplicantId является идентификатором в вашей базе данных, вы также должны добавить еще один атрибут:

public class ApplicantImage
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int ApplicantId { get; private set; }
    public byte[] Image { get; set; }
}
0 голосов
/ 09 декабря 2016

Я знаю, что это старый вопрос, но он все еще актуален.Я столкнулся с той же ситуацией, однако мы используем файл .tt для генерации .cs из нашего edmx.Наш .tt настроен на добавление атрибута [Key] в наш первый столбец таблицы для большинства ситуаций, но в моем случае я использовал row over () в SQL для генерации уникальных идентификаторов для первого столбца (прекрасно работает для большинстваситуации).Проблема в том, что это делает nullable, и .tt не настроен для добавления [Key] в этом случае.

Обтекание строки Over () в ISNULL ((), 0) смогисправить ошибку при создании столбца и решить мою проблему.В противном случае, как упомянул marianosz, простое использование .HasKey () в вашем контексте данных также будет работать нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...