5

我正在使用 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>());
        }
    }
}

如您所见,一个用户可以拥有多个角色。由于某种原因,我无法将角色存储在数据库中。

4

3 回答 3

10

枚举仍然是原始类型,尤其是整数。就像你的User类不能有一个ICollection<int>映射到数据库中的东西一样,它也不能有一个枚举的集合。

您应该定义一个Role如下所示的类:

public class Role
{
    public int Id {get; set;}
    public Roles Role {get; set;}
}

并将枚举的名称更改为Roles(或除 之外的任何名称Role)。

于 2013-02-24T14:31:49.687 回答
6

我仍在运行 Windows XP SP3,因此无法安装 .NET Framework 4.5,也无法运行测试以查看问题所在,但我可以猜到。在您的设计中,每个“用户”可能有零对多的“角色”,现在按照惯例,实体框架会在“角色”上生成一个外键来引用“用户”,但由于“角色”是一个复杂对象的枚举(值对象)实体框架不支持这种情况,“实体框架不支持在实体类型上具有复杂类型的集合”,您需要将角色设置为实体并给它一个 ID。只是为了确保我是正确的,尝试建立一对一的关系(每个用户只有一个角色),如果它有效,那么我是对的。

于 2013-02-24T00:03:37.063 回答
1

根据 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];
于 2016-06-08T15:24:08.253 回答