" 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来存储。