在 MVC 核心中搭建基架控制器时找不到主键

Primary key not found when scaffolding controller in MVC core

提问人:coolhand 提问时间:8/3/2017 最后编辑:Priyanka Vadhwanicoolhand 更新时间:12/4/2021 访问量:15986

问:

尝试为控制器搭建脚手架时,出现以下错误:

“运行所选代码生成器时出错:'实体 类型“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-核心-MVC

评论


答:

15赞 user1779775 8/3/2017 #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?有时我发现这是解决某些编译时错误的唯一方法。

评论

0赞 coolhand 8/3/2017
似乎只需要重置。很抱歉打扰了,但感谢您的帮助!
3赞 Randy Walker 11/18/2018
一旦我添加,脚手架对我来说就像一个魅力。{ get; set; }
7赞 Vikas 2/8/2020 #2

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

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

                });
            }

评论

0赞 Omzig 9/18/2020
呃,我不喜欢破解上下文!所以这对 be 有用,因为在我看来没有唯一的键......并且必须更改 Get 才能返回多个项目。非常感谢。
0赞 user6109759 4/10/2020 #3

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

这是我为“使用实体框架构建具有视图的 MVC 控制器”脚手架输入的模型类的 POCO

我终于弄清楚了缺少什么。[Key] 属性存在,但 POCO 的成员未声明为公共。别忘了你的公共关键词!!

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; }
}

评论

1赞 sicKo 4/10/2020
他已经提到他尝试使用 [Key] 属性,显然他有 public 关键字
0赞 Ronald Rink 'd-fens' 12/4/2021
这个答案对错误提出了两个建议,并且都在 OP 中已经提到(参见 @sicKo 的评论也提到了这一点),所以我不明白,这如何成为一个好的答案。
3赞 Sabel 5/8/2020 #4

确保删除实体。哈斯诺键();也来自modelBuilder。

0赞 Hughesey 7/5/2021 #5

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

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

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

之后,我能够创建控制器。

-1赞 Farukh Shaikh 12/3/2021 #6

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

基架-DbContext “服务器=DESKTOP-48G00GJ;数据库=AXITClassDesignEg;Trusted_Connection=真;” Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models -f

注:使用在最后-f

然后检查创建的 DbContext 文件。 转到控制器,右键单击添加基架。做!!!entity.Haskey

评论

0赞 Ronald Rink 'd-fens' 12/4/2021
我不认为,这真的回答了这个问题。@coolhand在他的问题中提到,他不知何故无法创建主键,事实上,这也是引用的错误消息所指出的。在你的回答中,你只是写了“确保主键存在”,但没有给出答案,应该如何做到这一点。