【问题标题】:Status Entities in .NET Core Entity Framework - suggested implementation.NET Core Entity Framework 中的状态实体 - 建议的实现
【发布时间】:2019-10-14 20:36:22
【问题描述】:

我是全栈软件开发的新手,我有一个任务是在 .NET Core 中创建一个简单的全栈 Web 应用程序,Entity Framework Core(当涉及到后端部分时),它将存储一些员工数据。现在,假设我有一个 Employee 实体。我们还需要以某种方式实现员工的职位(员工可以担任后端开发人员、前端开发人员、项目经理等职位)。这就是为什么我还创建了这个 EmployeePosition 类,以便在 Employee 中有一个 EmployeePosition 属性。我还有其他类似的状态实体,例如应用程序中的 EmployeePosition。

EmployeePosition 然后将被播种到数据库中的一个单独的表中,因此它可以适用于“将使用”这个应用程序的任何公司(只需使用不同的种子数据)。我将使用旧数据库进行播种。

现在看来这可行,但对我来说似乎也有点过于粗糙,因为每当我需要对存储库中的状态进行操作时,我都会使用状态的魔法 ID 号, 或在方法中的某处硬编码 status Name 属性(如果我没有针对给定操作的更智能的解决方法),例如“Switch(Position.Name) case "front-end": do stuff" 等。

我能否就如何更好地实现这一点获得建议或指导,我在这方面进展顺利吗?

在 EmployeePosition 中实际使用枚举作为数据类型会更好吗?关于如何实现它的任何建议?考虑到我必须使用旧数据库进行播种,我将不得不以某种方式从旧文件中创建我的枚举。

public class Employee
    {
        [Key]
        public int Id { get; set; }
        [Required]
        public string FirstName { get; set; }
        [Required]
        public string LastName { get; set; }
        [Required]
        public string Image { get; set; }
        [Required]
        public string Email { get; set; }
        [Required]
        public string Phone { get; set; }
        [Required]
        public EmployeePosition Position { get; set; }      
public class EmployeePosition
    {
        [Key]
        public int Id { get; set; }
        [Required]
        public string Name { get; set; }
    }

【问题讨论】:

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


    【解决方案1】:

    您可以为员工职位创建一个Enum

    public enum EmployeePosition
    {
       Backend = 0,
       Frontend = 1,
       DBA = 2,
    }
    

    还有你的员工实体

    public class Employee
    {
        [Key]
        public int Id { get; set; }
        [Required]
        public string FirstName { get; set; }
        [Required]
        public string LastName { get; set; }
        [Required]
        public string Image { get; set; }
        [Required]
        public string Email { get; set; }
        [Required]
        public string Phone { get; set; }
        [Required]
        public EmployeePosition Position { get; set; } 
    }
    

    然后就可以使用了

    If (Employee.Position == EmployeePosition.Backend)
    {
         // your logic.
    }
    

    【讨论】:

    • 您不能在不更改代码的情况下扩展职位列表。可能还可以,也可能不行。
    【解决方案2】:

    很遗憾,您有相互矛盾的要求。您说您的程序是“与状态无关的”:

    EmployeePosition 然后将被播种到数据库中的一个单独的表中,因此它可以适用于“将使用”这个应用程序的任何公司(只需使用不同的种子数据)。

    然而,事实并非如此:

    因为每当我需要对存储库中的状态进行操作时,我都会使用状态的魔法 ID 号,或者在方法的某处硬编码状态名称属性(如果我没有给定操作的更智能的解决方法),例如“Switch(Position.Name) case "front-end": do stuff" 等。

    因此,其中一项要求必须“获胜”。您的代码要么知道不同的状态是什么(因此不同的种子数据不起作用),要么不知道。

    如果第一个要求更重要:

    保持你的代码原样,你有一个完全合理的模型来处理 N 个状态,这些状态是预先不知道的,也没有任何特定于给定条目的逻辑

    如果第二个要求更重要:

    切换到枚举。您不希望代码中出现幻数字符串。正如您所提到的,您需要将每个现有数据行映射到预定义的枚举成员之一。

    【讨论】:

    • 现在更有意义了,我明白为什么了。有没有办法可以使用这个 EnumBuilder 类来实现这两者 - 从我拥有的文件中创建 Enums? docs.microsoft.com/en-us/dotnet/api/…
    • @Armino 我不明白这对你有什么好处。代码仍然需要或不需要知道实际值来执行逻辑。我猜它可以为您节省一些“写入时间”来创建枚举,但实际上从现有数据中创建枚举应该不难,特别是如果有逻辑(因为你不想要大量 switch 语句)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-16
    • 1970-01-01
    • 2022-11-02
    • 2023-03-29
    • 1970-01-01
    • 2017-05-05
    • 2017-06-13
    相关资源
    最近更新 更多