如何在Entity Framework中使用流畅的API映射一对多关系中的枚举?

时间:2014-07-08 11:41:15

标签: c# entity-framework enums

我的问题很简单,与另一个问题(How to map an enum in a one-to-many relationship with NHibernate?)有关,尽管我在这里特别询问了实体框架的流畅API。

让我们说(同一个例子)我在我的模型中有这两个实体,一个参考类型(用户)和另一个枚举(角色)。

class User { int id; IList<Roles> Roles; }

enum Roles { Worker, Manager, Director }

或者为了清楚起见,在这个表示中......

[users]   [ roles ] 
+-----+   +-------+
| id  |   |user_id|
+-----+   +-------+
          | value | <- [Represented by the enum]
          +-------+

现在我想使用流畅的API将它映射到Entity Framework中的我的数据库,但是如果我尝试...

 HasMany(x => x.Roles)
   .Cascade.All()
   .Table("UserRoles")
   .Element("RolesEnum");

...它会失败,因为HasMany()不是引用类型。

有没有办法在流畅的API中执行此操作,而不涉及将业务模型从枚举更改为类?

2 个答案:

答案 0 :(得分:1)

这不能直接回答你的问题,但你有没有想过将角色枚举变成标志枚举并将其作为整数存储在User表中?

你可以这样做:

class User 
{ 
    public int Id { get; set; } 
    public UserRole Roles { get; set; } 
}

[Flags]
public enum UserRole
{
    Guest = 0,
    Worker = 1,
    Manager = 1 << 2,
    Director = 1 << 3,
}

然后,要在用户表中存储多个角色,您可以像这样分配它们:

_user.Roles = UserRole.Worker | UserRole.Manager

答案 1 :(得分:1)

不,没有办法做到这一点。 EF(最多6.1)不支持映射值类型。

有几种方法可以做到:复杂类型,使用带有序列化列表的列......但它们是技巧,而不是直接的EF支持。