2011-04-20 112 views
1

我有Customers表:Customer(id,name status_id)。
我有状态表:状态(id,名称,代码)。
客户与状态之间有关系(FK):status_id(客户)= id(状态)。枚举与实体框架 - 枚举值独立于表行ID

在我状态枚举和客户类中的.NET代码:

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中显示客户类?

编辑:
所有我找到了解决方案假定枚举值都相同,客户表中的STATUS_ID。他们甚至没有对我非常重要的状态表,这是为了限制status_id的值的可能性。

回答

4

没办法。枚举根本不被支持,所以你必须改变你的类来包含statusId(不一定是公共的),而不是映射的customer_status,它将处理数据库记录到枚举的转换。您必须将依赖关系包含到recrod中,因为您的代码必须知道哪个记录Id代表哪个枚举成员。这不是结构映射,而是数据映射,当然这包括数据依赖性。

还不包括状态表到您的模型。

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

+0

@Ladislav Mrnka:非常appriciate帮助我。我不明白你的建议。实际上,存储在数据库中的值对代码是透明的 - 代码不应该关心值,而是代表状态表中代码的字符串。我想到了将字符串值转换为枚举类型的视图(与您的示例链接相同,但不是使用int - 使用字符串),但我不知道如何处理它。 – Naor 2011-04-20 20:30:58

+0

@Naor:这更加复杂 - 你想要将值从导航属性映射到枚举。所以你必须将Statuses表添加到模型中。每次加载客户时都必须加载它,并且必须再次定义单独的非映射属性,这会将相关实体转换为枚举。并且请注意,非映射属性不能用于linq-to-entities查询。 – 2011-04-20 20:34:11

+0

@Ladislav Mrnka:我能做什么?哪些“依赖价值”的可能性我有?我有我的表中的数据。改变我的代码中的所有枚举是很多工作。 – Naor 2011-04-20 20:45:14