实体框架核心问题:定义主键的“DbContext”创建错误

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

我正在开发 ASP.NET Core 应用程序并遇到 Entity Framework Core 问题。尽管在我的任务实体中定义了主键,但在尝试创建 DbContext 实例时收到错误。错误信息是:

无法创建类型为“”的“DbContext”。异常“实体类型‘任务’需要定义主键”。如果您打算使用无键实体类型,请在“OnModelCreating”中调用“HasNoKey”。

这是我的任务实体的相关代码:

using System.ComponentModel.DataAnnotations;

namespace taskManager.Services.TaskApi.Models
{
    public class Task
    {
        [Key]
        public int TaskId {  get; set; }
        [Required]
        public string Title { get; set; }
        public string Description { get; set; }
        [Required]
        public DateTime DateTime { get; set; }
        public bool IsCompleted { get; set; }
        public bool IsImportant { get; set; }        
    }
}

我的 AppDbContext 看起来像这样:

using Microsoft.EntityFrameworkCore;
using taskManager.Services.TaskApi.Models;

namespace taskManager.Services.TaskApi.Data
{
    public class AppDbContext : DbContext
    {
        public AppDbContext(DbContextOptions<AppDbContext> options) : base(options) { }
        public DbSet<Task> Tasks { get; set; }
    }
}

DbContext 在我的 Program.cs 中注册如下:

var builder = WebApplication.CreateBuilder(args);
// ... other configurations ...
builder.Services.AddDbContext<AppDbContext>(option =>
{
    option.UseSqlServer("Server=DESKTOP-39TI737\\SQLEXPRESS;Database=Manage_Task;Trusted_Connection=True;TrustServerCertificate=True");
});
// ... other configurations ...


c# sql-server asp.net-core entity-framework-core dbcontext
1个回答
0
投票

如果 EF 不明白您的主键应该自动生成,您始终可以添加注释属性来使用 Identity 标志标记您的实体,该标志将启用自动递增 ID 字段的功能。修改后,请确保您创建了新的迁移并更新了数据库。

更新实体:

using System.ComponentModel.DataAnnotations;

namespace taskManager.Services.TaskApi.Models
{
    public class Task
    {
        [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity), Key]
        public int TaskId {  get; set; }
        [Required]
        public string Title { get; set; }
        public string Description { get; set; }
        [Required]
        public DateTime DateTime { get; set; }
        public bool IsCompleted { get; set; }
        public bool IsImportant { get; set; }        
    }
}

对于目前的情况了解发生了什么:

检查您的数据库。我记得你的

TaskId
应该标记为 PK 并且应该启用
Identity
选项。

© www.soinside.com 2019 - 2024. All rights reserved.