asp.net-core - 错误,在使用 EF Core 值转换时必须在字符串中指定解析的有效信息
问题描述
基于 EF Core 文档(https://docs.microsoft.com/en-us/ef/core/modeling/value-conversions),我正在尝试在枚举上使用 EF Core 的新值转换。我想将枚举保存为 SQL 数据库表中的字符串。
这是实体和枚举。
public enum InputSetType
{
TypeA, TypeB
}
public class MonthlyInputSet
{
public int Id { get; set; }
public InputSetType Type { get; set; }
}
这里是我配置 MonthlyInputSet 实体的地方:
public class MonthlyInputSetConfiguration : IEntityTypeConfiguration<MonthlyInputSet>
{
public void Configure(EntityTypeBuilder<MonthlyInputSet> builder)
{
builder.Property(mis => mis.Type).HasConversion(v => v.ToString(), v => (InputSetType)Enum.Parse(typeof(InputSetType), v));
}
}
所以,我尝试运行一个基本查询来获取这些数据,但它失败了。查询是:
var saved = await _context.MonthlyInputSets.Include(mis => mis.InsertedBy)
.Include(mis => mis.UpdatedBy)
.Include(mis => mis.MonthlyInputs)
.ThenInclude(mi => mi.EmissionsUnit)
.FirstOrDefaultAsync(mis => mis.Id == id);
但是,在该查询的第一行抛出了一个错误,上面写着“ArgumentException:必须指定用于解析字符串的有效信息”。所以我的猜测是我没有正确配置表中字符串到C#中枚举的转换。
完整的原始堆栈跟踪:
我确认从数据库返回了正确的字符串值。它不为空,也不是空字符串。返回的字符串值与枚举的成员完全匹配。
public void Configure(EntityTypeBuilder<MonthlyInputSet> builder)
{
builder.Property(mis => mis.Type).HasConversion(
convertToProviderExpression: v => v.ToString(),
convertFromProviderExpression: v => Troubleshooting(v)
);
}
private InputSetType Troubleshooting(string v)
{
return (InputSetType)Enum.Parse(typeof(InputSetType), v);
}
这两个图像显示数据库类型列中每一行中的文本与映射到该字段的枚举的第二个成员相同。
解决方案
我可以重现此错误的唯一方法是v
成为一个空字符串,即""
。不是空值。
这个 :
Enum.Parse(typeof(InputSetType),"xx")
抛出Requested value 'xx' was not found.
。
虽然这样:
Enum.Parse(typeof(InputSetType),"")
抛出:
Must specify valid information for parsing in the string. (Parameter 'value')
似乎有些行包含一个空字符串而不是null
.
您必须决定如何处理这些值——它们是坏数据吗?或者应用程序应该处理它们并用一些默认值替换它们?
如果您决定使用默认值,您可以使用S
tring.IsEmpty or
String.IsNullOrWhitespace` 来处理它们,例如:
v=> String.NullOrWhitespace(v)?InputSetType.Unknown:Enum.Parse(typeof(InputSetType),v)
推荐阅读
- excel - 在删除它们之前获取重复的数量
- python - 如何使用 PyQt5 在编辑器旁边打印文本
- python - 元类的 Pytest 夹具
- javascript - 带有 Mongoose 的 Nodejs 返回一个对象值而不是数组中的多个
- django - 我将序列化程序创建方法用于什么?
- tabulator - 更改制表符树图标
- java - 希望使用户通过验证
- wordpress - 如何在构建 docker 映像之前更改 ElasticBeanstalk 上的文件权限?
- swift - 如何在 Modular Large Complication 中设置白色文本?
- python - Python - 局部变量保持内容重复调用函数