如何使枚举类型的属性,当我不使用POCO's,但EF生成的模型类

本文关键字:EF 模型 属性 类型 枚举 何使 POCO | 更新日期: 2023-09-27 18:12:41

我有一个名为DynamicControl的表。它有一个名为ControlType的属性,它是SQL Server 2008数据库中的nvarchar(255)

在代码中,我希望属性值是一个字符串,但它的字符串值必须来自枚举的字符串表示,如下所示:

public enum ControlType
{
    TextBox,
    TextArea,
    Password,
    RadioButton,
    Checkbox,
    DropDownList,
    MultiSelectList,
    DatePicker,
    TimePicker,
    DateTimePicker
}

我该怎么做?

我忘了添加一些重要的信息,但没有提供,这可能听起来像一个愚蠢的问题。问题是:我没有使用POCO。我受限于使用实体框架生成的模型类。如果我正在编写POCO,我只需将数据类型更改为enum即可。但是,由于我使用的是生成的模型,这样做将导致EDMX标记和模型类之间的差异。

更新我的问题是,我如何告诉实体框架在EDMX中生成正确的标记,以便所述属性是类型ControlType enum而不是字符串或Int32?

因此,我的问题是而不是如何将enum转换为字符串,反之亦然

如何使枚举类型的属性,当我不使用POCO's,但EF生成的模型类

简单地定义你的属性类型为你的enum(即:ControlType)

。net框架中的枚举类有许多Static成员函数来帮助您。假设您从数据库获取nvarchar值到名为dbCtrlType的字符串变量中,那么

 public ControlType ControlTypeEnum
 {
     get { return (ControlType)Enum.Parse(typeof(ControlType), dbCtrlType); }
     set { dbCtrlType = dbCtrlType.ToString(); }
 }

如果我得到了正确的,那么你需要做一些类似的微调

using System;
using System.ComponentModel;
namespace ConsoleApplication1
{
    public enum ControlDefaultClass
    {
        [Description("This is some string which you wanted to show")] MemberA,
        [Description("This is some other string which you wanted to show")] MemberB,
    }
    public class ConsoleApp
    {
        private static void Main(string[] args)
        {
            Console.WriteLine(GetDescription(ControlDefaultClass.MemberA));  //This line will print - This is some string which you wanted to show
            Console.WriteLine(GetDescription(ControlDefaultClass.MemberB));//This line will print - This is some other string which you wanted to show
            Console.Read();
        }
        public static string GetDescription(Enum value)
        {
            var fieldInfo = value.GetType().GetField(value.ToString());
            var attributes =
                (DescriptionAttribute[])fieldInfo.GetCustomAttributes(typeof(DescriptionAttribute), false);
            return attributes.Length > 0 ? attributes[0].Description : value.ToString();
        }
    }
}