添加[Key]后,“EntityType没有键定义”错误

时间:2013-06-19 14:34:23

标签: c# .net entity-framework ef-code-first

我提到了许多堆栈溢出问题,例如EntityType 'MyProfile' has no key defined. Define the key for this EntityType。提到的解决方案是定义[Key]属性。

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

  

EntityType“Role”没有定义键。定义此EntityType的密钥。

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

public abstract int RoleID { get; set; }

注意:Role类是abstract class

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();
        }
    }

实体

  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;
            }
        }
    }

}

1 个答案:

答案 0 :(得分:1)

除非我对此更加环保,否则我认为,您应该了解Code First框架如何使用实体框架。 :)

以下是我将如何创建类似于您尝试做的事情,我实际上没有构建代码,因此可能存在错误:

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
}

在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值。