2013-05-09 16 views
6

Przy użyciu EF 5 (najpierw kod poddany odwrotnej kolejności), mój model działał dobrze, dopóki nie nagle się zatrzymał."EntityType nie ma zdefiniowanego klucza" wyjątek, chociaż klucz jest zdefiniowany hasKey

\ tSystem.Data.Entity.Edm.EdmEntityType :: EntityType "ProjectsDate" nie ma zdefiniowanego klucza. Zdefiniuj klucz dla tego EntityType.

\ tSystem.Data.Entity.Edm.EdmEntityType :: EntityType "ProjectsRisk" nie ma zdefiniowanego klucza. Zdefiniuj klucz dla tego EntityType.

Definiuję klucz używając płynnego API zamiast atrybutów, tutaj są moje klasy ProjectsDates.

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); 

    } 
} 

Dlaczego nie EF zobaczyć moją biegle mapowanie API?

+4

Może nie dodać instancję 'ProjectsDateMap' do' modelBuilder.Configurations' w 'OnModelCreating'? – Slauma

+0

Po prostu podwójnie sprawdzone, jest w OnModelCreating, okrzyki i tak – Malkin

+0

Jaka szkoda, było to takie proste wyjaśnienie i naprawa :) Czy sprawdziłeś w debugerze, czy linia 'HasKey' faktycznie została przekazana? – Slauma

Odpowiedz

2

Z jakiegoś powodu (prawdopodobnie bug), FluentAPI potrzebuje klucz do być zdefiniowane w sposób konferencyjnym - czyli - ClassName + Id, lub w przypadku:

ProjectsDateId 

ten sposób metadane stworzony przez EF może potwierdzić fakt, że jest on powiązany. Bardzo irytujące, ale ...

+0

Nie działa.Mam podmiot o nazwie Oferta i ustawiam klucz, który ma nazywać się OfferID, ale EF wciąż narzeka, że ​​żaden klucz nie jest zdefiniowany. Jedyną rzeczą, która działa, jest użycie [Key, ForeignKey ("Offer")] na właściwości, a następnie właściwość może być nazwana cokolwiek, co chcę. – Triynko

0

Naprawiłem to, ponownie uruchamiając kod inżyniera wstecznego po raz pierwszy z elektronarzędzi EF. Wydaje się działać od tego momentu, wydaje się, że jest to ogólny problem, który pojawia się, gdy twoje modele nie są poprawnie skonfigurowane. Szkoda, że ​​wydaje się to tak ogólne i po prostu wywołuje mylące błędy.

1

Trzeba mieć wiążącego globalnego lub indywidualnego wiązania w OnModelCreating
(DbModelBuilder modelBuilder).

Tak to będzie wyglądać mniej więcej tak w pliku kontekstowego:

public override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    // global 
    modelBuilder.Configurations.AddFromAssembly(GetType().Assembly); 
    // individual 
    modelBuilder.Configurations.Add(new ProjectsDateMap()); 
}