在MVC核心中搭建控制器时未找到主键

时间:2017-08-02 18:58:30

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

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

  

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

    }

5 个答案:

答案 0 :(得分:7)

我不确定这是否可以解决您的问题,但可能会尝试以下方法。这听起来和你刚才描述的相似,不管怎么说我发布它只是为了确定。

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

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

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

答案 1 :(得分:3)

在ASP网络核心Mvc中安装支架时,我遇到了类似的问题。将此添加到您的 dbcontext文件可能有帮助!

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

                });
            }

答案 2 :(得分:1)

确保删除entity.HasNoKey();也来自modelBuilder。

答案 3 :(得分:0)

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

这是我输入的Model类的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; }
}

答案 4 :(得分:0)

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

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

重新创建它们

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

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