" EntityType has no key defined "即使添加[key]也会出错

本文关键字:key 出错 添加 EntityType has no defined | 更新日期: 2023-09-27 18:19:06

我提到了许多堆栈溢出问题,如EntityType 'MyProfile'没有定义键。定义这个EntityType的键。上面提到的解决方案是定义[Key] Attribute。

即使在添加[Key]属性后(当我尝试插入员工时),我也会得到以下错误。我们如何解决这个问题?

EntityType 'Role'没有定义键。为EntityType定义键

注意:即使在为RoleID添加setter后,我也会得到相同的错误。

public abstract int RoleID { get; set; }

注:Role类为abstract

EF Code First

  public static void InsertEmployees()
  {
        string connectionstring = @"Data Source=.;Initial Catalog=My19June_A;Integrated Security=True;Connect Timeout=30";
        using (var db = new My19June_A(connectionstring))
        {
            Employee emp1= new Employee();
            emp1.EmployeeID = 1;
            emp1.IsActiveEmployee = true;
            Employee emp2 = new Employee();
            emp2.EmployeeID = 2;
            emp2.IsActiveEmployee = true;
            db.Employees.Add(emp1);
            db.Employees.Add(emp2);
            int recordsAffected = db.SaveChanges();
        }
    }
<<p> 实体/strong>
  public abstract class Role : IEntityWithKey
  {
    public EntityKey EntityKey { get; set; }
    public abstract string RoleName { get; }
    [Key]
    public abstract int RoleID { get; }
  }
 public class ProgrammerRole : Role, IEntityWithKey
 {
    public EntityKey EntityKey { get; set; }
    public override string RoleName { get { return "Programmer"; } }
    [Key]
    public override int RoleID { get { return 101; } }
 }
 public class ManagerRole : Role, IEntityWithKey
 {
    public EntityKey EntityKey { get; set; }
    public override string RoleName { get { return "Manager"; } }
    [Key]
    public override int RoleID { get { return 102; } }
 }
public class Employee : IEntityWithKey
{
    public EntityKey EntityKey { get; set; }
    private bool isActiveEmployee;
    private IList<Role> roles;
    public virtual IList<Role> RolesList
    {
        get
        {
            return roles;
        }
    }
    public bool IsActiveEmployee
    {
        get
        {
            return isActiveEmployee;
        }
        set
        {
            isActiveEmployee = value;
        }
    }
    public int EmployeeID { get; set; }
    //Constructor
    public Employee()
    {
        roles = new List<Role>();
    }
    public void TerminateEmployeeByRole(Role role)
    {
        if (RolesList == null)
        {
            //If employee has no role, make as inactive
            isActiveEmployee = false;
        }
        else
        {
            //If employee has no role other than the input role, make as inactive
            RolesList.Remove(role);
            if (RolesList.Count == 0)
            {
                isActiveEmployee = false;
            }
        }
    }
}

除非我是绿色的,然后我认为,你应该阅读如何使用实体框架的代码第一的方式工作。:)

下面是我如何创建类似于你正在尝试做的事情,我还没有真正构建代码,所以可能会有错误:

public class Role
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.None)] // since you set the IDs in code
    public int RoleID { get; set; }
    public string RoleName { get; set; }
}
public class Employee
{
    public int EmployeeID { get; set; }
    public ICollection<Role> Roles { get; set; } // make it virtual for lazy loading
}

And in My19June_A:

public class My19June_A : DbContext
{
    public DbSet<Employee> { get; set; }
    public DbSet<Role> { get; set; }
    static My19June_A()
    {
        Database.SetInitializer<RegistryContext>(new CreateInitializer());
    }
    class CreateInitializer : CreateDatabaseIfNotExists<RegistryContext>
    {
        protected override void Seed(RegistryContext context)
        {
            void Seed()
            {
                var programmerRole = new Role() { RoleID = 101, RoleName = "Programmer" };
                var managerRole = new Role() { RoleID = 102, RoleName = "Manager" };
                context.Roles.Add(programmerRole);
                context.Roles.Add(managerRole);
                context.SaveChanges();        
            }
        }
    }
}

您可以通过选择各自的Id来获取角色。然而,另一种可能性是完全跳过在数据库中存储角色,因为您似乎需要针对不同角色的特定类。然后,数据库中的角色可以通过一个int-value来存储。