构建 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,
}
}
我的代码中有一些枚举。
一些事情:
- 枚举不是字符串。上面的示例
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();
}