管理具有实体框架的TypeLists

时间:2016-11-12 13:57:11

标签: c# sql-server asp.net-mvc entity-framework entity-framework-core

我处于困境,我有几个列表作为业务逻辑的一部分,需要在前端下拉选择(ID为值为FriendlyNameDescription) 。

此外,我将根据保存的数据库选择在业务逻辑中执行不同的操作。这意味着我需要GlobalConstantsEnums与我的代码中的ID匹配。

我应该使用Enums,为每个列表创建一个表,还是在使用EF时创建一个名为TypeList和TypeListItem的通用表?

1 个答案:

答案 0 :(得分:0)

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

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

EF6不为此提供开箱即用的解决方案。有几个Nuget包实现了同步自定义代码。我没有给你关于它们的建议,因为我没有使用它们。

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

如果你的情况是你只有这个FriendlyName扩展数据而没有上面引用的复杂场景,那么你可以在没有数据库表的情况下进行管理。例如,您可以为每个列表使用枚举,以及为您的枚举定义数组或字典的扩展,您可以在其中存储这些额外数据。每次值列表更改时,您都必须在代码中更新这些数据。

对于带有两个值和额外CategoryStatus项的简单枚举LocalizedName的示例实现(允许对翻译文本使用Resources值):

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,就像在注释掉的代码中一样。

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