构建EF代码优先应用程序的最佳方法,以便它可以很好地与枚举和TSQL代码一起使用

时间:2013-10-29 12:23:59

标签: c# entity-framework enums

我正在寻找一种更好的方法来构建我的应用程序,以便我可以使用实体框架使用枚举,以及需要使用TSQL的情况,例如存储过程,公用表表达式等。使用它看起来很棒linq到实体方面,但在TSQL方面,它看起来不太好,例如在投影结果时你想要枚举字符串值。我已经看过EF enum支持教程here和其他例子来自网络和SO和我似乎无法找到一种标准的方式

教程here

中的部分代码
public enum DepartmentNames
{
  English,
  Math,
  Economics
}    

public partial class Department
{
  public int DepartmentID { get; set; }
  public DepartmentNames Name { get; set; }
  public decimal Budget { get; set; }
}

我的问题列表是:

  • 如果存储过程公用表表达式,或者任何需要TSQL的内容,而不是linq to Entities
  • ,如何处理枚举
  • 假设我为EF创建了一个用于存储枚举值的类,最好的做法是在我的数据库中为枚举创建一个等效表,方法是创建一个类似于下面代码的类,并手动添加State1,State2 EF播种过程中的值等。
  • 如上所述,命名+构造枚举的最佳方法是什么,就像从代码中看到的那样

例如

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

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

2 个答案:

答案 0 :(得分:1)

我的代码中有一些枚举。

有些事情:

  • 枚举不是字符串。上面的示例English, Math, Economics分别代表数字0,1,2
  • 我检查了我的数据库,我找不到枚举,所以我猜EF不会为他们创建一个表(不过我可能错了)
  • 创建枚举时,类型是您的枚举,就像上面的示例一样。在您的情况下,它将是:public Type *name of your property*
祝你好运!

答案 1 :(得分:1)

在该示例中,枚举的整数值存储在数据库中,而不是字符串中。 EF将整数值映射到枚举值。 就个人而言,我更喜欢显式地为枚举的每个值编号,但不要将枚举嵌套在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
}

我使用了一个帮助方法(我在SO上找到了,但没有正确信用的链接,对不起)来获取枚举的描述属性,以便我可以在需要时有一个可呈现的字符串,而不是名称属性。

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();
    }