Entity type has no key defined 错误

控制器:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using MvcApplication1.Models;
using System.ComponentModel.DataAnnotations.Schema;


namespace MvcApplication1.Controllers
{
public class studentsController : Controller
{
//
// GET: /students/


public ActionResult details()
{
int id = 16;
studentContext std = new studentContext();
student first = std.details.Single(m => m.RollNo == id);
return View(first);
}


}
}

DbContext 模型:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.Entity;


namespace MvcApplication1.Models
{
public class studentContext : DbContext
{
public DbSet details { get; set; }
}
}

型号:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.ComponentModel.DataAnnotations.Schema;


namespace MvcApplication1.Models
{
[Table("studentdetails")]
public class student
{
public int RollNo;
public string Name;
public string Stream;
public string Div;
}
}

数据库表:

CREATE TABLE [dbo].[studentdetails](
[RollNo] [int] NULL,
[Name] [nvarchar](50) NULL,
[Stream] [nvarchar](50) NULL,
[Div] [nvarchar](50) NULL
)

在 global.asax.cs 中

Database.SetInitializer(null);

上面的代码列出了我正在处理的所有类:

“在模型生成期间检测到一个或多个验证错误”以及“实体类型没有定义键”。

331530 次浏览

Model 类应更改为:

using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.ComponentModel.DataAnnotations.Schema;
using System.ComponentModel.DataAnnotations;


namespace MvcApplication1.Models
{
[Table("studentdetails")]
public class student
{
[Key]
public int RollNo { get; set; }


public string Name { get; set; }


public string Stream { get; set; }


public string Div { get; set; }
}
}
  1. 确保学生班级的公共成员被定义为 物业 w/{get; set;}(你的是公共 变量-一个常见的错误)。

  2. [Key]注释放在所选属性的顶部。

在我的例子中,我在创建“ MVC5控制器与视图,使用实体框架”时得到了错误。

我只需要在创建 Model 类之后构建项目,而不需要使用[ Key ]注释。

我知道这个帖子迟到了,但是 这个解决方案帮助了我:

    [Key]
[Column(Order = 0)]
public int RoleId { get; set; }

[列(订单 = 0)] 在[钥匙]之后 可以增加1:

    [Key]
[Column(Order = 1)]
public int RoleIdName { get; set; }

等等。

EF 框架提示“无键”的原因是 EF 框架在数据库中需要一个主键。要声明性地告诉 EF 键是哪个属性,需要添加一个 [Key]注释。或者,最快的方法是添加一个 ID属性。然后,EF 框架将默认使用 ID作为主键。

使用[ key ]对我来说不起作用,但是使用 id 属性可以。 我只是在类中添加这个属性。

public int id {get; set;}

发生这种情况有几个原因,其中一些是我发现的 给你,另一些是我自己发现的。

  • 如果该属性的名称不是 Id,则需要向其添加 [Key]属性。
  • 键需要是属性,而不是字段。
  • 关键是 public
  • 密钥需要是符合 CLS 的类型,这意味着像 uintulong等无符号类型是不允许的。
  • 这个错误也可能是由 配置错误引起的。

一切都是正确的,但在我的情况下,我有两个类这样的

namespace WebAPI.Model
{
public class ProductsModel
{
[Table("products")]
public class Products
{
[Key]
public int slno { get; set; }


public int productId { get; set; }
public string ProductName { get; set; }


public int Price { get; set; }
}
}
}

在删除了上层阶级之后,它对我来说工作得很好。

对我来说,模特很好。这是因为我有2个实体框架的 不同的版本。一个版本用于 Web 项目,另一个版本用于包含模型的公共项目。

我只需要 巩固核心成果

enter image description here

好好享受吧!

对象必须包含一个字段,该字段将被用作 Primary Key,如果您有一个名为 Id的字段,那么默认情况下,这将是实体框架将链接到的对象的主键。

否则,您应该将 [Key]属性添加到希望用作 Primary Key的字段之上,并且还需要添加名称空间 System.ComponentModel.DataAnnotations:

public class myClass
{
public int Id { get; set; }
[Key]
public string Name { get; set; }
}

Https://stackoverflow.com/a/51180941/7003760

您不必一直使用 key 属性。请确保映射文件正确地定位了 key

this.HasKey(t => t.Key);
this.ToTable("PacketHistory");
this.Property(p => p.Key)
.HasColumnName("PacketHistorySK");

并且不要忘记在 Repository 的 OnModelCreate 中添加映射

modelBuilder.Configurations.Add(new PacketHistoryMap());

另外,记住,不要忘记像这样添加 公众人士关键字

[Key]
int RoleId { get; set; } //wrong method

必须像这样使用 Public 关键字

[Key]
public int RoleId { get; set; } //correct method

在我自己的项目中,我也通过解决代码中的这一行来解决这个问题。 我添加了以下内容。

[DatabaseGenerated(DatabaseGeneratedOption.None)]

在意识到我的错误之后,我就去把它改成

[DatabaseGenerated(DatabaseGeneratedOption.Identity)]

这进一步确保每次在数据库中插入新行时,名为“ Id”的字段的值都会增加