6

Unter Verwendung von EF 5 (rückentwickelter Code zuerst) funktionierte mein Modell einwandfrei, bis es plötzlich aufhörte.Ausnahme "EntityType hat keinen Schlüssel definiert" obwohl Schlüssel mit HasKey definiert wurde

\ tSystem.Data.Entity.Edm.EdmEntityType:: EntityType 'ProjectsDate' hat keinen Schlüssel definiert. Definieren Sie den Schlüssel für diesen EntityType.

\ tSystem.Data.Entity.Edm.EdmEntityType:: EntityType 'ProjectsRisk' hat keinen Schlüssel definiert. Definieren Sie den Schlüssel für diesen EntityType.

Ich definiere einen Schlüssel mit fließenden API anstelle von Attributen, hier ist meine ProjectsDates-Klassen.

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

    } 
} 

Warum fließend API-Mapping nicht EF sehen?

+4

Vielleicht haben Sie nicht eine Instanz von 'ProjectsDateMap' zu' modelBuilder.Configurations' in 'OnModelCreating' hinzufügen? – Slauma

+0

Nur doppelt überprüft, es ist in OnModelCreating, Prost sowieso – Malkin

+0

Was für eine Schande, es war so eine einfache Erklärung und zu beheben :) Haben Sie den Debugger eingecheckt, wenn die HasKey-Zeile tatsächlich übergeben wird? – Slauma

Antwort

2

Aus irgendeinem Grund (wahrscheinlich ein Fehler), muss FluentAPI der Schlüssel in einer Konvention Art und Weise definiert werden - das heißt - Class + Id oder in Ihrem Fall:

ProjectsDateId 

Auf diese Weise werden die Metadaten erstellt von EF kann die Tatsache, dass es verwandt ist, anerkennen. Sehr ärgerlich, aber ...

+0

Funktioniert nicht.Ich habe eine Entität namens Angebot, und ich habe den Schlüssel zu OfferID ernannt, aber EF klagt immer noch, dass kein Schlüssel definiert ist. Das einzige, was funktioniert, ist die Verwendung von [Key, ForeignKey ("Offer")] für die Property, und dann kann die Property beliebig benannt werden. – Triynko

0

Ich reparierte das, indem ich den Reverse-Engineer-Code zuerst von EF-Elektrowerkzeugen wieder lief. Von daher schien es ein generelles Problem zu sein, das auftritt, wenn Ihre Modelle nicht richtig konfiguriert sind. Es ist eine Schande, dass es so allgemein erscheint und nur irreführende Fehler verursacht.

1

Sie brauchen ein globales Bindung oder einzelne in OnModelCreating
(DbModelBuilder modelBuilder) Bindung haben.

So wäre es so etwas in Ihrem Kontext-Datei aussehen:

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