[英]Transition EF Core 3.1 to storing string enum values, rather than ints
我想知道对于将枚举值存储为整数的现有数据库的问题是否有一个优雅的解决方案,但想要过渡到存储新记录的字符串,但将整数单独留在旧记录中。 自然地,我们可以将列类型从 int 变为 string,而表示“Ready”的“2”仍然可以存储在 string 列中。
是否有一种技术允许 EF 在enum Status { Ready = 2 }
中将“2”或“Ready”解析为该Status.Ready
? 我知道 EF Core 有一个 EnumStringConverter 可以理解"Ready" -> Status.Ready
但是有没有办法扩展或自定义它,以便它尝试双向解析 db 值? (“Ready”作为枚举元素名称 -> 成功,“2”作为枚举元素名称 -> 失败,“2”作为枚举元素值 -> 成功)我们是否会编写一个转换过程,例如检查数据库中的所有字符值是数字,因此将其解析为值,否则将其解析为名称?
或者从使用整数切换到使用字符串的人是否也编写了大量迁移来更新每个枚举列中的每个值,以便所有现有的“2”都变成“就绪”?
您可以使用自定义转换器,如下所示
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder
.Entity<MyEntity>()
.Property(e => e.MyStatusColumn)
.HasConversion(
v => v.ToString(),
v => int.TryParse(v, out int val) ?
(Status)val :
(Status)Enum.Parse(typeof(Status), v)
);
}
根据我自己的实践,我将枚举值作为 int 存储在数据库中。 为了在客户端进行演示,我做了以下技巧。
在具有枚举属性 Status 的实体 class 中,创建另一个获取该枚举字符串值的属性:
public enum Status
{
None,
Ready,
InProcess,
NotReady
}
public class Process
{
public int Id { get; set; }
public Status Status { get; set; }
public string GetStatus
{
get
{
return Status.ToString();
}
}
}
在这里,如果您的 Process object 的 Status 属性值为 1,则 GetStatus 属性仅返回 Ready 字符串。
希望,这回答了你的问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.