虽然密钥是使用HasKey定义的,但“EntityType没有键定义”exception

使用EF 5(首先是逆向工程代码),我的模型工作正常,直到它突然停止。

\ tSystem.Data.Entity.Edm.EdmEntityType :: EntityType’Projects.Date’没有定义键。 定义此EntityType的键。

\ tSystem.Data.Entity.Edm.EdmEntityType :: EntityType’ProjectstRisk’没有定义键。 定义此EntityType的键。

我使用流畅的API而不是属性来定义键,这里是我的ProjectsDates类。

public partial class ProjectsDate { public string OSProjectCode { get; set; } public Nullable TargetStart { get; set; } public Nullable EndDateOriginal { get; set; } public Nullable EndDateChangeControl { get; set; } public Nullable EndDateActual { get; set; } public Nullable GoLiveAgreed { get; set; } public Nullable GoLiveActual { get; set; } public virtual Project Project { get; set; } } 
 public class ProjectsDateMap : EntityTypeConfiguration { 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); } } 

为什么EF没有看到我流畅的API映射?

出于某种原因(可能是一个错误),FluentAPI需要以常规方式定义密钥 – 即ClassName + Id,或者在您的情况下:

 ProjectsDateId 

这样,EF创建的元数据可以确认它与之相关的事实。 非常讨厌,但……

您需要在OnModelCreating具有全局绑定或单独绑定
DbModelBuilder modelBuilder )。

所以它在你的上下文文件中看起来像这样:

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

我通过首先从EF电动工具重新运行逆向工程代码来解决这个问题。 似乎从那里工作,这似乎是一个普遍的问题,当你的模型没有正确配置时,这个问题就会出现。 遗憾的是它看起来如此笼统,只会引发误导性错误。