我提到了许多堆栈溢出问题,例如EntityType 'MyProfile' has no key defined。定义此 EntityType 的键。提到的解决方案是定义[Key]
属性。
即使添加了 [Key] 属性(当我尝试插入员工时),我也会收到以下错误。我们如何解决这个问题?
EntityType 'Role' 没有定义键。定义此 EntityType 的键。
注意:即使在为 RoleID 添加设置器后,我也会收到相同的错误。
public abstract int RoleID { get; set; }
注意:角色类是abstract
类
EF 代码优先
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;
}
}
}
}