【问题标题】:Error Guid should contain 32 digits with 4 dashes错误 Guid 应包含 32 位数字和 4 个破折号
【发布时间】:2018-11-25 23:53:00
【问题描述】:

出错了

"Guid 应包含 32 位数字和 4 个破折号 (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)"

GUID 输入为“68f0eaed-189e-4c65-8cf8-475539d6f21b”


    context.Countries.AddRange(GetCountryData(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "csv", "country.csv")));

    await context.SaveChangesAsync();


    public List<Data.Country> GetCountryData(string filePath)
    {
        string csvRead = File.ReadAllText(filePath);
        string[] csvFileRecord = csvRead.Split('\n');
        List<Data.Country> dataRecordList = new List<Data.Country>();

        foreach (var row in csvFileRecord.Skip(1))
        {
            if (!string.IsNullOrEmpty(row))
            {
                var cells = row.Split(',');
                var dataRecord = new Data.Country
                {
                    Id = Guid.Parse(cells[0]),
                    Code = cells[1],
                    Name = cells[2]
                };
                dataRecordList.Add(dataRecord);
            }
        }

        return dataRecordList;
    }

CSV 文件

"id","code","name"
"68f0eaed-189e-4c65-8cf8-475539d6f21b","AX","Åland Islands"
"76cf600f-7bf6-40fb-8803-142eac60f3dd","AL","Albania"
...

EDITED 更新了代码,它现在获得了正确的 GUID 值,但仍然出现错误

My input "68f0eaed-189e-4c65-8cf8-475539d6f21b"

fail: MyApp.ContextSeed[0]
      Guid should contain 32 digits with 4 dashes (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx).
info: Microsoft.EntityFrameworkCore.Database.Command[20101]
      Executed DbCommand (1ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
      SELECT CASE
          WHEN EXISTS (
              SELECT 1
              FROM public.country AS c)
          THEN TRUE::bool ELSE FALSE::bool
      END

【问题讨论】:

  • Guid.Parse 在您在问题中显示的字符串上工作得很好;所以:我们必须推断出cells[1] 的值实际上不是您认为的字符串。所以:准确地写出值是什么,包括任何前导/尾随空格。也许if(!Guid.TryParse(cells[1], out var guid)) Console.WriteLine($"'{cells[1]}'");
  • 我试过 68f0eaed-189e-4c65-8cf8-475539d6f21b 它工作正常。可能你的行不正确
  • 您确定 Guid 在第 1 列而不是 0 列吗?索引从 0 开始计数...
  • 已编辑见上面的 csv 文件格式
  • @HansKesting 是的 guid 是 0 而不是 1 :) ...但是跳过不起作用!

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


【解决方案1】:

我建议将代码更改为以下内容:

public List<Data.Country> GetCountryData(string filePath)
    {
        string csvRead = File.ReadAllText(filePath);
        string[] csvFileRecord = csvRead.Split('\n');
        List<Data.Country> dataRecordList = new List<Data.Country>();

        foreach (var row in csvFileRecord.Skip(1))
        {
            if (!string.IsNullOrEmpty(row))
            {
                var cells = row.Split(',');
                var dataRecord = new Data.Country
                {
                    Id = Guid.Parse(cells[0].Replace("\"", "")),
                    Code = cells[1].Replace("\"", ""),
                    Name = cells[2].Replace("\"", "")
                };
                dataRecordList.Add(dataRecord);
            }
        }

        return dataRecordList;
    }

根据您刚刚添加的信息,很明显您正在尝试将不是 Guid 的字符串转换为 Guid。请注意cells 处的新索引。 csvFileRecord.Skip(1); 也没有跳过任何内容;现在它应该可以工作了,因为在foreach 的头部返回了一个新的IEnumerable。 另请注意,您需要从 cells! 中删除 " 字符!

【讨论】:

  • 更新了代码,它现在获得了正确的 GUID 值但仍然出现错误(请参阅 OP 中的错误消息)
  • 太棒了!你拯救了我的一天
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多