C# 实体框架需要定义主键,且现有 SQL Server 表存在身份主键错误

问题描述 投票:0回答:1

所以我目前正在学习 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 中。

c# sql-server rest entity-framework entity-framework-core
1个回答
0
投票

在“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; }
}
© www.soinside.com 2019 - 2024. All rights reserved.