【问题标题】:Entity Framework Core requires a primary key to be definedEntity Framework Core 需要定义一个主键
【发布时间】: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 哦,天哪……这很尴尬。感谢您指出!

标签: c# entity-framework


【解决方案1】:

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

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

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

然后它就起作用了。

【讨论】:

  • 感谢您指出我忘了在答案中实际添加 setter
猜你喜欢
  • 2017-11-23
  • 2019-02-13
  • 2022-09-27
  • 2020-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-05
相关资源
最近更新 更多