2013-05-09 12 views
6

Utilizzando EF 5 (codice retroingegnerizzato per primo), il mio modello funzionava correttamente finché non si è fermato improvvisamente."EntityType non ha un'eccezione definita chiave" sebbene la chiave sia definita con HasKey

\ tSystem.Data.Entity.EdmEntityType:: EntityType 'ProjectsDate' non ha alcuna chiave definita. Definire la chiave per questo EntityType.

\ tSystem.Data.Entity.Edm.EdmEntityType:: EntityType 'ProjectsRisk' non ha alcuna chiave definita. Definire la chiave per questo EntityType.

Definisco una chiave utilizzando API fluente anziché attributi, ecco le mie classi di 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); 

    } 
} 

Perché EF non vedere il mio mappatura API fluente?

+4

Forse non aggiungere un'istanza di 'ProjectsDateMap' a' modelBuilder.Configurations' in 'OnModelCreating'? – Slauma

+0

Appena ricontrollato, è in OnModelCreating, applausi comunque – Malkin

+0

Che peccato, era stata una spiegazione e una correzione così semplici :) Avete controllato nel debugger se la linea 'HasKey' è effettivamente passata? – Slauma

risposta

2

Per qualche motivo (probabilmente un bug), FluentAPI ha bisogno della chiave da definire in modo convenzione - che è - ClassName + Id, o nel tuo caso:

ProjectsDateId 

In questo modo i metadati creato da EF può riconoscere il fatto che è correlato. Molto fastidioso, ma ...

+0

Non funziona.Ho un'entità denominata Offerta e imposto la chiave per essere denominata OfferID, ma EF continua a lamentarsi che non è stata definita alcuna chiave. L'unica cosa che funziona è usare [Key, ForeignKey ("Offer")] sulla proprietà, e quindi la proprietà può essere chiamata qualsiasi cosa io voglia. – Triynko

0

Ho risolto il problema eseguendo nuovamente il codice di reverse engineering dagli elettroutensili EF. Sembrava funzionare da lì fuori, questo sembra essere un problema generale che prende il volo quando i tuoi modelli non sono configurati correttamente. È un peccato che sembra così generale e fa solo un errore fuorviante.

1

È necessario disporre di un individuo vincolante o globale vincolante in OnModelCreating
(DbModelBuilder modelBuilder).

Quindi sarebbe simile a questa nel file di contesto:

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