ef 5 codefirst枚举集合未在数据库中生成

时间:2013-02-23 20:30:08

标签: entity-framework ef-code-first

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

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

3 个答案:

答案 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];