【问题标题】:ef 5 codefirst enum collection not generated in databaseef 5 codefirst 枚举集合未在数据库中生成
【发布时间】:2013-02-23 20:30:07
【问题描述】:

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

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

【问题讨论】:

    标签: entity-framework ef-code-first


    【解决方案1】:

    枚举仍然是原始类型,尤其是整数。正如您的 User 类不能有一个映射到数据库中某些内容的 ICollection&lt;int&gt; 一样,它也不能有枚举的集合。

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        根据 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];
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-02-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-09-12
          相关资源
          最近更新 更多