如何在实体框架4.1模型中表示动态类枚举字段/属性

本文关键字:动态 表示 枚举 字段 属性 模型 实体 框架 | 更新日期: 2023-09-27 18:12:32

我正在尝试创建一个系统的POC,该系统允许您创建和修改最终在使用前端的应用程序中使用的枚举。像动态枚举。

例如,在一个假设的bug跟踪应用程序中,我们可以有一个status枚举,它的值可以是open, acceptedclosed。所有这些枚举(及其对应的值)都可以通过UI实时更改,因此管理员有可能在应用程序生命周期的某个时候(很可能通过admin页面)提出一个新的reassigned值。也可以创建新的枚举,这些枚举又有自己的值(例如,complexity枚举)。

我目前设想的方式是,我将有一个Enumeration类,它有一个1:*EnumerationValue类的参考。

public class Enumeration {
    public string Name { get; set; }
    public ICollection<EnumerationValue> Values { get; set; }
}
public class EnumerationValue {
    public string Name { get; set; }
    public string Description { get; set; }
}

这是容易的部分。当我开始创建实际使用这些动态枚举的实体时,我遇到了一个障碍。

假设我正在创建BugRecord实体,因此它具有Status属性。按照上面的逻辑,我必须这样写:

public class BugRecord {
    public EnumerationValue Status { get; set; }
}

但是考虑到我可以有很多不同的Enumeration s(和EnumerationValue s),我是否有办法将BugRecord.Status值限制为Enumeration状态下的EnumerationValue s ?如果没有,你会建议我如何解决这类问题?

如何在实体框架4.1模型中表示动态类枚举字段/属性

创建第三个Entity/JoinTable EnumerationChoice并使用它将BugRecord映射到EnumerationValue

public class EnumerationChoice {
    public Enumeration EnumerationCategory { get; set; }
    public EnumerationValue Value { get; set; }
}

BugRecord现在变成:

public class BugRecord {
    public EnumerationChoice BugType { get; set; }
    public EnumerationChoice Status { get; set; }
}

数据现在看起来像:

BugRecord:
    EnumerationChoice:
        -BugType
        -BugTypeValue1
    EnumerationChoice:
        -Status
        -Open

这样,当您尝试填充EnumerationChoice时,您可以引用EnumerationCategory来获取分配给它的有效EnumerationValues。