2013-05-09 28 views
6

Sử dụng EF 5 (mã được thiết kế ngược trước), mô hình của tôi hoạt động tốt cho đến khi nó dừng đột ngột."EntityType không có khóa được xác định" ngoại lệ mặc dù khóa được xác định bằng HasKey

\ tSystem.Data.Entity.Edm.EdmEntityType:: EntityType 'ProjectsDate' không có khóa nào được xác định. Xác định khóa cho EntityType này.

\ tSystem.Data.Entity.Edm.EdmEntityType:: EntityType 'ProjectsRisk' không có khóa được xác định. Xác định khóa cho EntityType này.

Tôi xác định khóa sử dụng API thông thạo hơn là thuộc tính, dưới đây là các lớp ProjectsDates của tôi.

public partial class ProjectsDate 
{ 
    public string OSProjectCode { get; set; } 
    public Nullable<System.DateTime> TargetStart { get; set; } 
    public Nullable<System.DateTime> EndDateOriginal { get; set; } 
    public Nullable<System.DateTime> EndDateChangeControl { get; set; } 
    public Nullable<System.DateTime> EndDateActual { get; set; } 
    public Nullable<System.DateTime> GoLiveAgreed { get; set; } 
    public Nullable<System.DateTime> GoLiveActual { get; set; } 
    public virtual Project Project { get; set; } 
} 
public class ProjectsDateMap : EntityTypeConfiguration<ProjectsDate> 
{ 
    public ProjectsDateMap() 
    { 
     // Primary Key 
     this.HasKey(t => t.OSProjectCode); 

     // Properties 
     this.Property(t => t.OSProjectCode) 
      .IsRequired() 
      .HasMaxLength(10); 

     // Table & Column Mappings 
     this.ToTable("ProjectsDates"); 
     this.Property(t => t.OSProjectCode).HasColumnName("OSProjectCode"); 
     this.Property(t => t.TargetStart).HasColumnName("TargetStart"); 
     this.Property(t => t.EndDateOriginal).HasColumnName("EndDateOriginal"); 
     this.Property(t => t.EndDateChangeControl).HasColumnName("EndDateChangeControl"); 
     this.Property(t => t.EndDateActual).HasColumnName("EndDateActual"); 
     this.Property(t => t.GoLiveAgreed).HasColumnName("GoLiveAgreed"); 
     this.Property(t => t.GoLiveActual).HasColumnName("GoLiveActual"); 

     // Relationships 
     this.HasRequired(t => t.Project) 
      .WithOptional(t => t.ProjectsDate); 

    } 
} 

Tại sao không EF thấy bản đồ API thông thạo của tôi?

+4

Có lẽ bạn không thêm một thể hiện của 'ProjectsDateMap' cho' modelBuilder.Configurations' trong 'OnModelCreating'? – Slauma

+0

Chỉ cần kiểm tra lại, đó là trong OnModelCreating, cổ vũ anyway – Malkin

+0

Thật đáng tiếc, nó đã được một lời giải thích đơn giản và sửa chữa :) Bạn đã kiểm tra trong trình gỡ rối nếu dòng 'HasKey' thực sự được thông qua? – Slauma

Trả lời

2

Đối với một số lý do (có thể là một lỗi), FluentAPI cần chìa khóa để được định nghĩa theo cách ước - đó là - ClassName Id +, hoặc trong trường hợp của bạn:

ProjectsDateId 

Bằng cách này các siêu dữ liệu được tạo ra bởi EF có thể thừa nhận thực tế nó có liên quan. Rất khó chịu nhưng ...

+0

Không hoạt động.Tôi có một thực thể tên là Offer, và tôi đặt khóa để được đặt tên là OfferID, nhưng EF vẫn phàn nàn không có khóa nào được định nghĩa. Điều duy nhất hoạt động là sử dụng [Key, ForeignKey ("Offer")] trên thuộc tính, và sau đó thuộc tính có thể được đặt tên bất cứ thứ gì tôi muốn. – Triynko

0

Tôi đã sửa lỗi này bằng cách chạy lại mã kỹ sư đảo ngược đầu tiên từ các công cụ điện EF. Dường như để làm việc từ đó ra, điều này có vẻ là một vấn đề chung mà đá lên khi mô hình của bạn không được cấu hình đúng. Đó là một sự xấu hổ nó có vẻ rất chung chung và chỉ đá lên những sai lầm gây hiểu lầm.

1

Bạn cần có một cá nhân ràng buộc hoặc toàn cầu ràng buộc trong OnModelCreating
(DbModelBuilder modelBuilder).

Vì vậy, nó sẽ giống như thế này trong tập tin ngữ cảnh của bạn:

public override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    // global 
    modelBuilder.Configurations.AddFromAssembly(GetType().Assembly); 
    // individual 
    modelBuilder.Configurations.Add(new ProjectsDateMap()); 
} 
Các vấn đề liên quan