5

Khi chạy ứng dụng asp.net mvc đầu tiên của tôi, tôi nhận được lỗi này Tôi nghĩ rằng khung thực thể sẽ tự động tạo khóa của tên cột kết thúc bằng Id? nó không đúng?EntityType 'ApplicantPosition' không có khóa được xác định

Như bạn có thể thấy ApplicantPositionID sẽ là một bảng có 2 cột làm khóa chính vì nó sẽ liên quan đến Người nộp đơn và cũng có thể Vị trí.

Một hoặc nhiều lỗi xác nhận đã được phát hiện trong thế hệ người mẫu:

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. 

Các lỗi được ném vào dòng này:

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

Và mô hình của tôi là một trong những sau:

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 
    } 



} 

Trả lời

11

Mã EF Đầu tiên chỉ có thể phỏng đoán rằng thuộc tính là khóa chính nếu thuộc tính được gọi là Id hoặc <class name>Id (hoặc nếu được chú thích bằng thuộc tính Khóa). Vì vậy, bạn cần phải mở rộng ví dụ: ApplicantImage với một tài sản ApplicantImageId hoặc Id, vv

Edit: Một artice về coneventions: Conventions for Code First

+1

Tôi đã chuyển hình ảnh sang lớp người nộp đơn vì tôi không muốn tạo bảng cho nó. Và tôi đặt một cách rõ ràng [Key] khi cần thiết. bây giờ nó hoạt động tốt. cảm ơn –

2

Bạn có thể thêm [Key] atributte đến tài sản ApplicantId hoặc làm điều đó thông qua API thạo trọng OnModelCreating phương pháp DbContext

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

Trong trường hợp của bạn, quy ước đặt tên EF trước tiên sẽ tìm một cột ID (phân biệt chữ hoa chữ thường). Nếu không có gì, hãy tìm kiếm ApplicantImageId và khi nó không tìm thấy gì, nó sẽ làm tăng lỗi đó.

Vì vậy, bạn nên thêm [Key] thuộc tính trên ID của bạn:

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

và nếu ApplicantId cột là danh tính trong cơ sở dữ liệu của bạn, bạn nên thêm thuộc tính khác quá:

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

tôi biết đây là một câu hỏi cũ nhưng nó vẫn có liên quan. Tôi chạy vào tình hình tương tự tuy nhiên chúng tôi sử dụng một tập tin .tt để tạo ra các .cs từ edmx của chúng tôi. .tt của chúng tôi được thiết lập để thêm thuộc tính [Key] vào cột đầu tiên của bảng trong hầu hết các trường hợp, nhưng trong trường hợp của tôi, tôi đã sử dụng hàng trên() trong SQL để tạo id duy nhất cho cột đầu tiên (hoạt động tốt nhất cho hầu hết các trường hợp) tình huống). Vấn đề với nó là nó làm cho một nullable và .tt đã không được thiết lập để thêm [Key] trong trường hợp này.

Gói hàng Over() trong ISNULL ((), 0) có thể sửa lỗi khiến cột không bị rỗng và giải quyết được sự cố của tôi. Nếu không, như đã đề cập bởi marianosz, chỉ cần sử dụng .HasKey() trong ngữ cảnh dữ liệu của bạn cũng sẽ hoạt động tốt.

Các vấn đề liên quan