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

本文关键字:代码 枚举 TSQL 很好 应用程序 EF 最佳 构建 方式 | 更新日期: 2023-09-27 18:37:13

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

此处教程中的部分代码

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 创建了一个类来存储枚举值,
  • 最佳做法是在我的数据库中为枚举创建一个等效表,方法是创建一个等效的类,如下面的代码所示,并在 EF 种子设定过程中手动添加 State1、State2 值等。
  • 按照上面,命名+结构枚举的最佳方法是什么,就像你从代码中看到的那样

例如

public class SomeStateType
{
    public int SomeStateTypeId { get; set; }
    public string Name { get; set; }
    public enum Type
    {
        State1 = 1,
        State2 = 2,
    }
}

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

我的代码中有一些枚举。

一些事情:

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

祝你好运!

在此示例中,枚举的整数值存储在数据库中,而不是字符串中。 EF 将整数值映射到枚举值。就个人而言,我更喜欢像您一样显式编号枚举的每个值,但不要将枚举嵌套在数据库模型类中 - 原因是您可能希望能够在其他地方使用枚举来检查数据库对象的"状态"。

//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 上找到的,但没有正确信用的链接,抱歉)来获取枚举的描述属性,以便如果需要,我可以拥有一个可呈现的字符串,而不是 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();
    }