所以我目前正在学习 RESTful API 和 ASP.NET。我有一个现有的 SQL Server 数据库,其中有一个名为“反馈”的表,其中包含 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; }
}
}
数据为:
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));
}
}
}
但是当我运行应用程序并通过 Swagger UI 测试 POST 调用时,我收到错误:
System.InvalidOperationException:'实体类型'反馈'需要定义主键。如果您打算使用无键实体类型,请在“OnModelCreating”中调用“HasNoKey”。有关无密钥实体类型的更多信息,请参阅 https://go.microsoft.com/fwlink/?linkid=2141943。'
我似乎找不到任何解决方案,因为大多数搜索结果都与插入到标识列有关,我不需要它,因为我只希望数据库服务器来处理它,或者从头开始设置数据库/表通过实体框架,我没有这样做,因为数据库已经存在于 SQL Server 中。
在“Feedback”类中,“Id”属性被声明为私有。实体框架要求属性至少是受保护的或公共的,以便将它们识别为实体模型的一部分。将“Id”属性的访问修饰符更改为 public,如下所示:
public class Feedback
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; } // Change access modifier to public
public string Name { get; set; }
public string Description { get; set; }
}