首页 > 解决方案 > 错误,在使用 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);
    }

这两个图像显示数据库类型列中每一行中的文本与映射到该字段的枚举的第二个成员相同。

在此处输入图像描述 在此处输入图像描述

标签: asp.net-coreentity-framework-core

解决方案


我可以重现此错误的唯一方法是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.

您必须决定如何处理这些值——它们是坏数据吗?或者应用程序应该处理它们并用一些默认值替换它们?

如果您决定使用默认值,您可以使用String.IsEmpty orString.IsNullOrWhitespace` 来处理它们,例如:

v=> String.NullOrWhitespace(v)?InputSetType.Unknown:Enum.Parse(typeof(InputSetType),v)

推荐阅读