现有SQL Server自增主键表下EF Core提示需定义主键的问题
问题描述
我正在学习ASP.NET Core RESTful API开发,现有一个SQL Server数据库,其中包含一张feedback表,该表有一个IDENTITY(1,1) PRIMARY KEY id列。
模型代码
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using System.Diagnostics.CodeAnalysis; namespace Feedback_RESTful_API.Models { public class Feedback { [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] int Id { get; set; } public string Name { get; set; } public string Description { get; set; } } }
DbContext代码
using Feedback_RESTful_API.Models; using Microsoft.EntityFrameworkCore; namespace Feedback_RESTful_API.Data { public class ApiContext : DbContext { public DbSet<Feedback> Feedbacks { get; set; } public ApiContext(DbContextOptions<ApiContext> options) : base(options) { } } }
控制器代码
using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Feedback_RESTful_API.Models; using Feedback_RESTful_API.Data; namespace Feedback_RESTful_API.Controllers { [Route("[controller]")] [ApiController] public class FeedbackController : ControllerBase { private readonly ApiContext _context; public FeedbackController(ApiContext context) { _context = context; } [HttpPost] public JsonResult Create(Feedback feedback) { //Add the new entry _context.Feedbacks.Add(feedback); //Save the db _context.SaveChanges(); //Return response return new JsonResult(Ok(feedback)); } } }
错误信息
System.InvalidOperationException: The entity type 'Feedback' requires a primary key to be defined. If you intended to use a keyless entity type, call 'HasNoKey' in 'OnModelCreating'.
解决方案
问题核心在于Feedback模型的Id属性没有公共访问修饰符,默认是私有状态,EF Core无法识别该属性作为主键。
修复步骤
- 给
Id属性添加public修饰符:
[Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public int Id { get; set; }
额外优化(针对已有数据库场景)
如果不想依赖数据注解,可以在ApiContext中通过Fluent API显式配置主键和自增规则:
protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Feedback>() .HasKey(f => f.Id); modelBuilder.Entity<Feedback>() .Property(f => f.Id) .UseIdentityColumn(); // 对应SQL Server的IDENTITY(1,1)规则 }
同时,控制器的Create方法可以优化为更符合REST规范的写法:
[HttpPost] public ActionResult<Feedback> Create(Feedback feedback) { _context.Feedbacks.Add(feedback); _context.SaveChanges(); return CreatedAtAction(nameof(GetFeedback), new { id = feedback.Id }, feedback); }
内容的提问来源于stack exchange,提问作者Tyler Mason
相关产品推荐
相关产品推荐

