5

İlk asp.net mvc uygulamasını çalıştırırken bu hata aldım Varlık framework otomatik olarak Id ile biten sütun adlarının anahtarlarını oluşturacağını düşündüm? doğru değil mi?EntityType 'ApplicantPosition' hiçbir anahtar tanıma sahip değil

ApplicantPositionID değerini, Başvuru Sahipleri ve ayrıca Konum ile ilgili olacağı için birincil anahtar olarak 2 sütun içeren bir tablo olacağını görebilirsiniz.

Bir veya daha fazla doğrulama hataları modeli oluşturma sırasında tespit edilmiştir:

hata bu satırda atılır
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()); 
     } 

Ve modeli aşağıdaki biridir:

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 
    } 



} 

cevap

11

EF Kodu İlk olarak, yalnızca bir özelliğin birincil anahtar olduğunu tahmin edebilirsiniz özelliği, Id veya <class name>Id (veya anahtar özniteliğine ek açıklamalıysa) olarak adlandırılırsa. Yani, örn. Bir ApplicantImageId veya Kimliği özelliğiyle ApplicantImage vb

Düzenleme: coneventions hakkında bir artice: Conventions for Code First

+1

Resmi, başvuru sahibi sınıfına taşıdım çünkü bunun için bir tablo oluşturmak istemedim. Ve gerektiğinde açıkça [Key] koydum. şimdi iyi çalışıyor. Teşekkürler –

2

Mülk ApplicantId-[Key] atributte eklemek veya

modelBuilder.Entity<ApplicantImage >().HasKey(p => p.ApplicantId); 
yöntem DBContext OnModelCreating basan Akıcı API aracılığıyla yapabilir Sizin durumunuzda, EF adlandırma kuralı önce bir ID (büyük/küçük harf duyarsız) sütunu arar.
1

Hiçbir şey, ApplicantImageId arar ve hiçbir şey bulamadığında, bu hatayı artırır.

Yani, kimliği [Anahtar] özelliği eklemeniz gerekir:

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

ve ApplicantId sütun kimlik veritabanınızda ise, sen de başka bir özelliği eklemeniz gerekir:

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

I Bu eski bir soru olduğunu biliyorum ama yine de geçerli. Aynı durumla karşılaştım, ancak .mc'yi edmx'ten oluşturmak için bir .tt dosyası kullanıyoruz. Bizim .tt, çoğu durum için tablonun ilk sütununda [Key] özelliğini eklemek üzere ayarlandı, ancak ilk sütun için benzersiz bir kimlik oluşturmak için SQL'de bir satır() kullanarak bir satır kullanıyordum (çoğu için harika çalışıyor) durumlar). Bununla ilgili sorun bir nealable oldu ve bu durumda [Key] eklemek için kurulum değildi.

Satırı sarma ISNULL() içindeki bir(), 0) sütun null yapmamak düzeltmek ve benim sorunumu çözmeyi başardı. Aksi takdirde, marianosz tarafından belirtildiği gibi, sadece veri bağlamında .HasKey() kullanarak iyi çalışır.

İlgili konular