使用实体框架管理类型列表

本文关键字:类型 列表 管理 框架 实体 | 更新日期: 2023-09-27 18:17:47

我处于一种困境,我有几个列表作为业务逻辑的一部分,需要在前端进行下拉选择(w/Id作为值,FriendlyName作为Description)。

此外,我将根据保存的数据库选择在业务逻辑中做不同的事情。这意味着我将需要GlobalConstantsEnums匹配我的代码中的id。

我应该使用Enums,为每个列表创建一个表,或者在使用EF时创建一个称为TypeList和TypeListItem的通用表吗?

使用实体框架管理类型列表

这个答案并没有为你的问题提供一个具体的解决方案,但我希望它能给你一些提示。

在SO中有几个关于这个问题的帖子,例如这个。一种流行的方法是在代码中使用枚举,并在数据库中使用表来存储枚举扩展信息(如显示名称和其他数据),并通过使用自定义代码将枚举中的更改应用于数据库表内容来保持它们的同步(尽量避免手动编写SQL脚本)。

EF6没有为此提供开箱即用的解决方案。有几个Nuget包实现了同步定制代码。我不能给你建议,因为我没有用过。

你还必须考虑你的具体情况:列表更改的频率,列表的大小,是否只需要一些漂亮的名称来显示或其他额外的数据,是否允许用户更改列表或仅由开发人员完成,是否需要在运行时动态更改这些数据(不修改/编译/发布代码),你正在使用的EF版本,等等。EF的未来版本可能会对此提供支持。

如果您只有FriendlyName扩展数据,而没有上面提到的复杂场景,也许您可以不使用数据库表进行管理。例如,您可以为每个列表使用一个枚举,并在扩展中为枚举定义一个数组或字典,用于存储这些额外的数据。每次值列表发生变化时,您都必须在代码中更新这些数据。

一个简单的枚举CategoryStatus有两个值和一个额外的LocalizedName项(它允许使用资源值翻译文本)的示例实现:

public enum CategoryStatus
{
    Active = 0,
    Inactive = 1
}
public static class CategoryStatusExtension
{
    private static string[] localizedNames = new string[] { 
        Resources.Strings.CategoryStatus_Active,
        Resources.Strings.CategoryStatus_Inactive
    };
    public static string LocalizedName(this CategoryStatus self)
    {
        switch (self)
        {
            case CategoryStatus.Active:
                return localizedNames[0];
                break;
            case CategoryStatus.Inactive:
                return localizedNames[1];
                break;
        }
        return null;
        //int index = (int)self - 1;
        //return localizedNames[index];
    }
}

你可以这样使用:

var categoryStatus = CategoryStatus.Active;
var textToUse = categoryStatus.LocalizedName();

您还可以找到一种方法来自动化更多的值搜索,而不是使用显式的switch,就像在注释掉的代码中一样。

关于对所有枚举只使用一个表,这同样取决于这些考虑因素。如果您的列表很小,没有很多列表,并且将来不会有很多新列表,那么您可能应该为每个枚举使用单独的表。我认为你的代码将更容易编写/维护,如果你使用单独的表。