【问题标题】:Primary key not found when scaffolding controller in MVC core在 MVC 核心中搭建控制器时找不到主键
【发布时间】:2018-01-10 03:48:19
【问题描述】:

在尝试搭建控制器时,我收到以下错误:

“运行所选代码生成器时出错:'实体 类型“Company.Models.Office”需要在以下位置定义主键 Microsoft.VisualStudio.Web.CodeGeneration.ActionInvoker.b_6-0()"

我是 MVC Core 的新手,但我的理解是主键默认定义为 ID 或 classnameID。我还尝试添加 [Key] 属性并将主键重命名为 OfficeID。我和另一个班级经历了类似的过程,并没有遇到这个问题

public class Office
    {
        public int ID;
        public string Name;
        public int SiteID;

    }

【问题讨论】:

    标签: c# asp.net-core-mvc


    【解决方案1】:

    我不确定这是否能解决您的问题,但不妨试试以下方法。这听起来与您已经描述的相似,但我还是发布了它以确保它。

    public class Office
    {
        [Key]
        public int OfficeID { get; set; }
        public string Name { get; set; }
        public int SiteID { get; set; }
    }
    

    您应该知道,调用什么主键并不重要。但是,为了方便和遵循标准,您应该将其称为“ID”或表/类名加上“ID”。

    另外,您是否尝试过重新启动 Visual Studio 和您的 PC?有时我发现这是解决某些编译时错误的唯一方法。

    【讨论】:

    • 似乎只需要重置。很抱歉打扰,但感谢您的帮助!
    • 一旦我添加了{ get; set; },脚手架对我来说就像一个魅力。
    【解决方案2】:

    我在 Asp net core Mvc 中搭建支架时遇到了类似的问题。将此添加到您的 Dbcontext 文件可能会有所帮助!

    protected override void OnModelCreating(ModelBuilder modelBuilder)
                {
                    base.OnModelCreating(modelBuilder);
                    modelBuilder.Entity<Office>(entity =>
                    {
                        entity.HasKey(x=>x.OfficeID);
    
                    });
                }
    

    【讨论】:

    • Ugg,我不喜欢破解上下文!所以这很有效,因为在我看来没有唯一的键......并且必须更改 Get 以返回多个项目。非常感谢。
    【解决方案3】:

    确保删除 entity.HasNoKey();也来自模型构建器。

    【讨论】:

      【解决方案4】:

      我在搭建 asp.net core MVC 控制器方法时发现了类似的错误。该错误报告了与此问题标题中相同的错误。

      这是我输入的模型类的 POCO,用于使用实体框架构建“带有视图的 MVC 控制器”

      我终于弄清楚缺少什么了。 [Key] 属性存在,但 POCO 的成员未声明为 public。不要忘记您的 PUBLIC 关键字!!

      public class RiskLimit
      {
          [Key]
          int Id { get; set; }
          DateTime BeginMappingDateTime { get; set; }
          DateTime? EndMappingDateTime { get; set; }
      }
      

      一旦我将代码更改为

      public class RiskLimit
      {
          [Key]
          public int Id { get; set; }
          public DateTime BeginMappingDateTime { get; set; }
          public DateTime? EndMappingDateTime { get; set; }
      }
      

      【讨论】:

      • 他已经提到他尝试使用 [Key] 属性,显然他有 public 关键字
      • 这个答案对错误提出了两个建议,并且都已经在 OP 中提到(参见@sicKo 的评论也提到了这一点),所以我看不出这是一个很好的答案。
      【解决方案5】:

      我刚遇到这个问题。我忘记在 SQL 表中设置主键了。

      我最终删除了所有模型类,并使用 -

      重新创建它们

      Scaffold-DbContext "Server=.\sqlexpress;Database=YOURDB;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models

      之后,我就可以创建控制器了。

      【讨论】:

        【解决方案6】:

        首先,确保您的表包含主键,然后运行以下命令,以便使用 EF Db first 方法创建模型类:

        脚手架-DbContext “服务器=DESKTOP-48G00GJ;数据库=AXITClassDesignEg;Trusted_Connection=True;” Microsoft.EntityFrameworkCore.SqlServer -OutputDir 模型 -f

        注意:最后使用-f

        然后检查 DbContext 文件,entity.Haskey 已创建。 转到控制器,右键单击添加脚手架。完成!!!

        【讨论】:

        • 我不认为这真的回答了这个问题。 @coolhand 在他的问题中提到,他以某种方式无法创建主键,事实上,这也是引用的错误消息所指出的。在你的回答中,你只写了“确保主键存在”,但没有给出答案,应该怎么做。
        猜你喜欢
        • 2018-11-17
        • 2019-02-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多