Entity Framework Core 需要定义一个主键

Posted

技术标签:

【中文标题】Entity Framework Core 需要定义一个主键【英文标题】:Entity Framework Core requires a primary key to be defined 【发布时间】:2020-10-18 06:03:30 【问题描述】:

我目前有 2 个实体,PlayerRole。我正在尝试为这两个实体创建迁移(第一次迁移)。

播放器.cs:

using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using Stargazer.Game.Roles;

namespace Stargazer.Game.Players

    [Table("players")]
    public class Player
    
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int Id  get; set; 
        
        [Required]
        [MaxLength(15)]
        public string Username  get; set; 
        
        [Required]
        public string Password  get; set; 
        
        [Required]
        public string Email  get; set; 
        
        public string Motto  get; set; 
        
        [Required]
        public string Figure  get; set; 
        
        [Required]
        public char Gender  get; set; 
        
        [Required]
        public Role Role  get; set; 
        
        [Required]
        [DefaultValue(500)]
        public int Coins  get; set; 
        
        public string? ConsoleMotto  get; set; 
        
        [Required]
        public string Salt  get; set; 
    

还有 Role.cs:

using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace Stargazer.Game.Roles

    [Table("roles")]
    public class Role
    
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int Id  get; 
        
        [Required]
        public string Name  get; 
    

但是,只有Role,我收到此错误:

System.InvalidOperationException:实体类型“角色”需要定义主键。如果您打算使用无密钥实体类型调用“HasNoKey()”

但是,如果我删除 Role 实体并将 PlayerRole 更改为 int,则它可以工作。所以Player实体是正确的,而两个实体的Id属性完全一样。

为什么我仍然收到Role 实体的错误?

【问题讨论】:

您缺少角色类属性的设置器。 @Gusman 哦,天哪……这很尴尬。感谢您指出! 【参考方案1】:

即使这是一个愚蠢的错误,我仍然想把它留在这里以备将来参考&以防有人犯同样的错误..

我忘记在我的属性上添加设置器。我不得不将我的属性更改为:

[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id  get; set; 
        
[Required]
public string Name  get; set; 

然后它就起作用了。

【讨论】:

感谢您指出我忘了在答案中实际添加 setter

以上是关于Entity Framework Core 需要定义一个主键的主要内容,如果未能解决你的问题,请参考以下文章

使用Entity Framework Core需要注意的一个全表查询问题

Entity Framework Core 性能优化

Entity Framework Core 性能优化

Entity Framework Core 性能优化

Entity Framework Core 计数没有最佳性能

C# ASP.NET Core Entity Framework Core 异步 ToQueryable 比较