EF Code First报EntityType无键定义 登录功能运行异常如何解决?
问题解决方法
错误根因
EF Code First要求所有映射到数据库的实体必须显式或隐式定义主键,你当前代码存在两个核心问题:
User实体没有配置主键,不符合EF的主键识别约定User实体的外键配置存在重复冲突,同时定义了PersonId和PersonForeignKey两个关联到Person的外键字段,导致EF映射异常
注:Person实体的Id属性符合EF默认主键约定,无需额外修改
具体修改步骤
1. 给User实体添加主键
EF默认会自动将命名为Id或[类名]Id的int/guid类型属性识别为主键,也可以通过[Key]特性手动指定主键,需要先引入命名空间using System.ComponentModel.DataAnnotations;
2. 清理冲突的外键配置
删除多余的PersonForeignKey字段,保留[ForeignKey]标注的PersonId作为外键即可
修改后的User实体代码示例:
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; namespace Entities.Concrete { public class User:IEntity { // 新增主键,符合EF默认约定,也可以命名为UserId public int Id { get; set; } [ForeignKey("Person")] public int PersonId { get; set; } public string UserName { get; set; } public string Password { get; set; } public bool IsActive { get; set; } public DateTime LastLoginDate { get; set; } // 删除了多余的PersonForeignKey字段 public Person Person { get; set; } } }
可选:Fluent API配置方案
如果不想在实体类上加特性,也可以通过Fluent API在上下文里配置映射关系,重写SchoolDBContext的OnModelCreating方法即可:
namespace DataAccess.Concrete.EntityFramework { public class SchoolDBContext : DbContext { public SchoolDBContext():base("SchoolDB") { } public DbSet<Student> Students{ get; set; } public DbSet<Person> Persons { get; set; } public DbSet<User> Users { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { // 配置User的主键 modelBuilder.Entity<User>().HasKey(u => u.Id); // 配置Person和User的外键关联 modelBuilder.Entity<User>() .HasRequired(u => u.Person) .WithMany(p => p.Users) .HasForeignKey(u => u.PersonId); } } }
额外逻辑修正提示
你当前Login方法的查询条件中p.IsActive == false意味着仅查询已禁用的Person账号,大概率是逻辑写反了,建议修改为p.IsActive == true。
内容的提问来源于stack exchange,提问作者Ahmetfurkandur_
相关产品推荐
相关产品推荐

