【问题标题】:"EntityType has no key defined" exception although key is defined with HasKey“EntityType has no key defined”异常,尽管键是用 HasKey 定义的
【发布时间】:2013-05-03 22:31:47
【问题描述】:

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

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

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

我使用 fluent 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 看不到我的 fluent API 映射?

【问题讨论】:

  • 也许您没有在OnModelCreating 中将ProjectsDateMap 的实例添加到modelBuilder.Configurations
  • 刚刚仔细检查,它在 OnModelCreating 中,无论如何都干杯
  • 真可惜,它已经是一个如此简单的解释和修复:) 如果HasKey 行确实通过了,您是否检查了调试器?
  • 是的,我已经准备好感到尴尬,但很高兴它正在工作啊哈;p。如果我断点模型图类应该被击中吗?我似乎无法点击OnModelCreatingHasKey
  • 嗯,不太明白。你的意思是在第二个 using (var ctx = new MyContext()) OnModelCreating 被调用但不是在第一个?您可以顺便编辑您的问题以将新信息放入其中(使用问题下方的“编辑”链接)。这是一个比长评论线程更好的地方。 (顺便说一句,我已经更改了您的问题标题。“实体框架”并不是一个有意义的标题:))

标签: c# entity-framework model ef-code-first entity-framework-5


【解决方案1】:

您需要在OnModelCreating中进行全局绑定或单独绑定
(DbModelBuilder modelBuilder)。

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

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

【讨论】:

    【解决方案2】:

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

    ProjectsDateId
    

    这样,EF 创建的元数据可以确认它是相关的事实。 很烦人但是...

    【讨论】:

    • 不起作用。我有一个名为 Offer 的实体,我将密钥设置为 OfferID,但 EF 仍然抱怨没有定义密钥。唯一可行的是在属性上使用 [Key,ForeignKey("Offer")],然后可以将属性命名为我想要的任何名称。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-06
      • 2020-03-31
      • 1970-01-01
      • 2015-12-11
      • 2017-08-24
      • 2012-09-02
      相关资源
      最近更新 更多