我正在使用EF5和.NET 4.5。 我有一个特定的类在数据库中生成不正确。 虽然我的网站有点复杂,但我会简化;
namespace Store.Enities
{
public enum Role
{ Manager, Clerk }
public class User
{
public int Id {get; set;}
public ICollection<Role> Roles {get; set;}
}
public class StoreContext : DbContext
{
public DbSet<User> Users {get; set;}
public StoreContext()
{
Database.SetIntializer(new DropCreateDatabaseIfModelChanges<StoreContext>());
}
}
}
正如您所看到的,用户可以拥有多个角色。 由于某种原因,我无法将角色存储在数据库中。
答案 0 :(得分:10)
枚举仍然是原始类型,特别是整数。正如您的User
类不能将ICollection<int>
映射到数据库中的某些内容一样,它也不能包含枚举的集合。
您应该定义一个Role
类,如下所示:
public class Role
{
public int Id {get; set;}
public Roles Role {get; set;}
}
并将枚举的名称更改为Roles
(或Role
以外的任何内容)。
答案 1 :(得分:6)
我仍在运行Windows XP SP3,因此无法安装.NET Framework 4.5,我无法运行测试以查看错误但我可以猜到。在您的设计中,每个“用户”可能具有零到多“角色”,现在按惯例,实体框架将在“角色”上生成外键以引用“用户”,但由于“角色”是枚举,它是复杂对象(值对象)实体框架不支持这种情况,“实体框架不支持在实体类型上具有复杂类型的集合”,您需要使角色成为实体并为其提供ID。只是为了确保我是正确的尝试一对一地建立关系(每个用户只有一个角色),如果它有效,那么我是对的。
答案 2 :(得分:0)
根据Gert Amold的回答,您可以使用隐式运算符创建一个不错的包装类:
public class RoleWrapper
{
public int Id { get; set; }
// Role is any Enum
public Role Role { get; set; }
public static implicit operator Role(RoleWrapper val)
{
return val.Role;
}
public static implicit operator RoleWrapper(Role val)
{
return new RoleWrapper() { Role = val };
}
}
这样您就可以使用具有原始枚举类型角色的集合:
myUser.Roles.Add(Role.WhateverRole);
Role firstRole = myUser.Roles[0];