【问题标题】:Enums with entity framework - enum value independent from table row id [duplicate]具有实体框架的枚举 - 独立于表行 ID 的枚举值 [重复]
【发布时间】:2011-08-09 19:20:51
【问题描述】:

我有客户表:客户(id,名称 status_id)。
我有状态表:状态(id、名称、代码)。
客户和状态之间存在关系(FK):status_id(客户)= id(状态)。

在 .NET 代码中,我有 Status 枚举和 Customer 类:

enum Status {
    status_1,
    status_2,
    status_3,
    status_4
}

class Customer {
    public virtual long id {get;set;}
    public virtual string name {get;set;}
    public virtual Status customer_status {get;set;}
}

枚举没有来自数据库的状态行的值,因为我不想在代码中创建数据的依赖关系(硬编码)。

如何使用实体框架在 edmx 中呈现客户类?

编辑:
我找到的所有解决方案都假定枚举值与 Customer 表中的 status_id 相同。他们甚至没有对我来说非常重要的 Status 表,以便限制 status_id 的值的可能性

【问题讨论】:

    标签: c# .net entity-framework enums mapping


    【解决方案1】:

    没办法。根本不支持枚举,因此您必须更改您的类以包含 statusId(不必是公共的)和未映射的 customer_status,后者将处理数据库记录到枚举的转换。您必须包含对记录的依赖项,因为您的代码必须知道哪个记录 ID 代表哪个枚举成员。那不是结构映射,而是数据映射,其中当然包括数据依赖性。

    也不要在模型中包含状态表。

    有一个approach to fake enums in EFv4,但它需要更多地更改您的代码,并且枚举成员可能不得不使用与数据库记录相同的值。

    【讨论】:

    • @Ladislav Mrnka:真的很感谢帮助我。我不明白你的建议是什么。实际上,存储在数据库中的值对代码是透明的——代码不应该关心值,而是表示状态表中代码的字符串。我想到了将字符串值转换为枚举的视图(与您的示例链接相同,但不使用 int - 使用字符串),但我不知道如何处理它。
    • @Naor:那就更复杂了——你想将导航属性的值映射到枚举。因此,您必须将 Statuses 表添加到模型中。每次加载客户时都必须预先加载它,并且必须再次定义单独的非映射属性,它将相关实体转换为枚举。请注意,非映射属性不能用于 linq-to-entities 查询。
    • @Ladislav Mrnka:我能做什么?我有哪些“依赖值”的可能性?.. 我的表中有数据。更改我代码中的所有枚举需要做很多工作。
    • @Naor:不要更改数据 - 您必须修改您的客户对象。该对象必须负责将相关的“状态对象”转换为枚举。
    • @Ladislav Mrnka:好的,我明白了。客户将持有表中的 status_id 并将其转换为枚举。但是,如果枚举没有值,我该如何进行从 int 到枚举的转换?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多