【问题标题】:How to map an enum in a one-to-many relationship with fluent API in Entity Framework?如何在实体框架中将枚举映射为与流式 API 的一对多关系?
【发布时间】:2014-07-08 11:41:15
【问题描述】:

我的问题很简单,并且与另一个问题 (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]
          +-------+

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

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

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

有没有一种方法可以在不涉及将我的业务模型从枚举更改为类的 fluent API 中执行此操作?

【问题讨论】:

    标签: c# entity-framework enums


    【解决方案1】:

    这并不能直接回答您的问题,但您是否考虑过将 Role 枚举设为 flags 枚举并将其作为整数存储在 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
    

    【讨论】:

    • 这是不可接受的,因为这不是一个新鲜的发展。当我与上述业务模型的二进制文件绑定时,我无法更改它,而且如果存储数据的数据库已经存在多年并且包含上述关系,那么这不是一个好的选择。在最坏的情况下,我会将它映射到一个类,但老实说,它应该能够映射到一个实体,虽然我不知道如何。
    【解决方案2】:

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

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

    【讨论】:

    • 嗨@JotaBe,这些解决方法中的任何一个不需要更改模型?
    • 这取决于你通过改变模型所理解的。如果您想使用序列化技巧,并且为序列化列表添加新属性正在更改模型,是的,它会更改。如果你想尝试复杂类型的东西,是的,模型会改变。但是,如果它是“业务模型”,为什么要将其视为“数据(EF)模型”而不是进行一些映射以保持“业务模型”和“数据库模型”独立?我们开发人员应该找到业务问题的解决方案,当有替代方案时,不要花太多时间解决技术问题。
    • 您好@JotaBe...我会回答您之前的评论,尽管它关注的问题是 = 0。我有一个现有的业务模型,现在需要移植到 OData 服务在 WebAPI 中。 ASP.Net 的 OData 可以直接从 Entity Framework 中获取任何内容,但这是非常紧密耦合的,我们希望尽可能地将业务层与 db 松散耦合。这意味着业务模型及其到数据库的映射必须尽可能少地了解,但我仍然需要保持 IQueryable 表达式的美妙之处。
    • ¡Compañero!,恐怕唯一的解决方案是创建具有 FK Id 和值的“虚拟”类。由于 EF 不支持它并且您想通过 OData 公开模型,我认为这是最快的解决方案(如果您的客户端是 .NET 或 JS,我认为进行映射以使其具有所需的形状仍然很容易)。我想你一直在使用 NHibernate,所以这样的东西对你来说是理想的:github.com/pvginkel/NHibernate.OData 但我不知道成熟度水平是否足以用于生产,或者是否有其他选择。谷歌“NHibernate OData”了解更多信息。
    • 请进行谷歌查询。我浏览了结果,发现了一些有趣的事情。如果您足够幸运,其中一件将适合您的问题。例如,如果您使用的是 JS Breeze,它是一个很棒的 JS OData 客户端,它对 NH 有某种支持:breezejs.com/documentation/nhibernate-support。它包括服务器端和客户端。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-07
    • 1970-01-01
    • 1970-01-01
    • 2020-12-19
    • 1970-01-01
    相关资源
    最近更新 更多