首先使用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<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);
}
}
为什么EF没有看到我流畅的API映射?
答案 0 :(得分:2)
出于某种原因(可能是一个错误),FluentAPI需要以常规方式定义密钥 - 即 - ClassName + Id,或者在您的情况下:
ProjectsDateId
这样,EF创建的元数据可以确认它与之相关的事实。 非常讨厌,但是......
答案 1 :(得分:1)
您需要在OnModelCreating
中拥有全局绑定或个人绑定
(DbModelBuilder modelBuilder
)。
所以它在你的上下文文件中看起来像这样:
public override void OnModelCreating(DbModelBuilder modelBuilder)
{
// global
modelBuilder.Configurations.AddFromAssembly(GetType().Assembly);
// individual
modelBuilder.Configurations.Add(new ProjectsDateMap());
}
答案 2 :(得分:0)
我通过首先从EF电动工具重新运行逆向工程代码来解决这个问题。似乎从那里工作,这似乎是一个普遍的问题,当你的模型配置不正确时,这个问题就会出现。遗憾的是,它看起来如此笼统,只会引发误导性错误。