C# 构造EF代码优先应用程序的最佳方法,这样它就可以很好地处理枚举和TSQL代码端

C# 构造EF代码优先应用程序的最佳方法,这样它就可以很好地处理枚举和TSQL代码端,c#,entity-framework,enums,C#,Entity Framework,Enums,我正在寻找一种更好的方法来构造我的应用程序,以便我可以使用实体框架处理枚举,以及需要使用TSQL(如存储过程、公共表表达式等)的情况。在linq到实体端使用它看起来很棒,但是在TSQL方面,它看起来不太好,例如在投影结果时,您需要枚举字符串值。我已经看过EF enum支持教程和来自web等的其他示例,我似乎找不到标准方法 教程中的部分代码 我的问题清单是: 在存储过程或公共表表达式或任何需要TSQL而不是linq到实体的情况下,如何处理枚举 假设我为EF创建了一个类来存储枚举值,那么最好的做法

我正在寻找一种更好的方法来构造我的应用程序,以便我可以使用实体框架处理枚举,以及需要使用TSQL(如存储过程、公共表表达式等)的情况。在linq到实体端使用它看起来很棒,但是在TSQL方面,它看起来不太好,例如在投影结果时,您需要枚举字符串值。我已经看过EF enum支持教程和来自web等的其他示例,我似乎找不到标准方法

教程中的部分代码

我的问题清单是:

  • 在存储过程或公共表表达式或任何需要TSQL而不是linq到实体的情况下,如何处理枚举
  • 假设我为EF创建了一个类来存储枚举值,那么最好的做法是在数据库中为枚举创建一个等效表,方法是创建一个类似于下面代码的等效类,并在EF种子设定过程中手动添加State1、State2值等
  • 下面,您可以从代码中看到,命名并构造枚举的最佳方法是什么
比如说

public class SomeStateType
{
    public int SomeStateTypeId { get; set; }
    public string Name { get; set; }

    public enum Type
    {
        State1 = 1,
        State2 = 2,
    }
}

我的代码中有一些枚举。

有些事情:
  • 枚举不是字符串。上面的示例
    英语、数学、经济
    分别表示数字
    0,1,2
  • 我检查了我的数据库,但找不到枚举,所以我猜EF没有为它们创建表(尽管我可能错了)
  • 创建枚举时,类型是您的枚举,如上面的示例所示。在您的情况下,它将是:
    public Type*您的财产名称*

祝你好运

在本例中,枚举的整数值存储在数据库中,而不是字符串中。EF将整数值映射到枚举值。 就我个人而言,我更喜欢对枚举的每个值进行显式编号,正如您所做的那样,但不要将枚举嵌套在db模型类中—原因是您可能希望能够在其他地方使用枚举来检查db对象的“状态”

//Model
public class Course
{
    public int ID { get; set; }
    public CourseTypes CourseType { get; set; }
    //stuff omitted
}

public enum CourseTypes
{
    [Description("Training")]
    Training = 1,
    [Description("Awareness Only")]
    AwarenessOnly = 2
    //etc
}
我还使用了一个helper方法(我在SO上找到了它,但是没有链接到正确的credit,抱歉)来获取枚举的description属性,这样如果需要的话,我就可以拥有一个可呈现的字符串,而不是name属性

public static string GetEnumDescription<TEnum>(TEnum value)
    {
        FieldInfo fi = value.GetType().GetField(value.ToString());

        DescriptionAttribute[] attributes = (DescriptionAttribute[])fi.GetCustomAttributes(typeof(DescriptionAttribute), false);

        if ((attributes != null) && (attributes.Length > 0))
            return attributes[0].Description;
        else
            return value.ToString();
    }
public静态字符串GetEnumDescription(TEnum值)
{
FieldInfo fi=value.GetType().GetField(value.ToString());
DescriptionAttribute[]attributes=(DescriptionAttribute[])fi.GetCustomAttributes(typeof(DescriptionAttribute),false);
如果((attributes!=null)&&(attributes.Length>0))
返回属性[0]。说明;
其他的
返回值.ToString();
}

谢谢,我一直在考虑让CourseTypes enum单独作为一个表。原因是当不使用Linq to Entities时,例如一个带有join to CourseTypes sql语句的存储过程,结果显示了一组以enum值为字符串的行。谢谢,enum在Linq to Entities端很好,但在sql代码上却不行(当您需要做一些更复杂的事情时,我以前就做过这样的评估)例如存储过程、公共表表达式等,用枚举作为字符串来显示sql语句的结果是不方便的
public static string GetEnumDescription<TEnum>(TEnum value)
    {
        FieldInfo fi = value.GetType().GetField(value.ToString());

        DescriptionAttribute[] attributes = (DescriptionAttribute[])fi.GetCustomAttributes(typeof(DescriptionAttribute), false);

        if ((attributes != null) && (attributes.Length > 0))
            return attributes[0].Description;
        else
            return value.ToString();
    }