gpt4 book ai didi

c# - Entity Framework - 一般持久化枚举?

转载 作者:太空狗 更新时间:2023-10-29 21:46:31 26 4
gpt4 key购买 nike

尝试创建一种变通方法来使用泛型在 Entity Framework 中处理枚举,但 EF 似乎并不关心泛型属性。例如:

public enum MyEnum
{
One, Two, Three
}

public class SomePOCOWithEnum
{
// I want this to persist as an int, but EF doesn't like generics.
public EnumWrapper<MyEnum> MyEnumProperty { get; set; }
}

目的是让枚举在数据库中作为 INT 持久存在。有没有什么特殊的方法可以使用 fluent 或其他一些机制方法来创建所述泛型类并将其作为 INT 持久保存到 EF 中的数据库中?

目的是保持通用性,因为我有大约两打需要持久化的枚举,我不想为每个枚举编写单独的包装器类。

这是通用的 EnumWrapper 类,它演示了我想要完成的事情:隐式转换为枚举,但作为 int 持久化:

public class EnumWrapper<T> where T : struct
{
private T enumValue;
public int Value
{
get { return Convert.ToInt32(enumValue); }
set { enumValue = (T)Enum.Parse(typeof(T), value.ToString()); }
}

public T EnumValue
{
get { return enumValue; }
set { enumValue = value; }
}

public static implicit operator T(EnumWrapper<T> wt)
{
return wt.EnumValue;
}

public static implicit operator EnumWrapper<T>(T t)
{
return new EnumWrapper<T>() { EnumValue = t };
}

public override string ToString()
{
return enumValue.ToString();
}
}

最佳答案

正如 silinew 已经指出的那样,EF5 明确支持枚举,但如果您出于某种原因无法迁移到它,我采用的方法可能适合您。

对于这个例子,假设表名为“Email”,我们有一个名为“Priority”的列。像往常一样将列设置为 int。接下来,在您的实体项目中,创建一个映射到您的 int 值的枚举类:

public enum EmailPriorityEnum
{
Now = 100,
Soon = 1000,
Whenever = 10000
}

最后,在您的实体项目中,创建一个与您的实体匹配的部分类文件,并手动将枚举映射到那里:

public partial class Email
{
public EmailEnums.EmailPriorityEnum EmailPriority
{
get { return (EmailEnums.EmailPriorityEnum)Priority; }
set { Priority = (int)value; }
}
}

从那时起,您的代码可以透明地引用此属性。这种方法的主要缺点是:

  1. 你必须小心,所有可能的值都用正确的 ID 映射到枚举中。对于经常变化的枚举,这就成了问题。
  2. 开发人员仍然可以访问底层列,除非您更改可访问性并且可以想象地绕过枚举并使用他们喜欢的任何值。

关于c# - Entity Framework - 一般持久化枚举?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8677810/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com