【问题标题】:EF Core : duplicate values sent to databaseEF Core:发送到数据库的重复值
【发布时间】:2020-06-24 17:24:49
【问题描述】:

我的代码:

using var context = new NorthwindContext();
        
var csvConfig = new CsvConfiguration(CultureInfo.InvariantCulture)
{
    Delimiter = ";",
    HeaderValidated = null,
    MissingFieldFound = null
};

using var reader = new StreamReader("csvfile.csv");
using var csv = new CsvReader(reader, csvConfig);

var records = csv.GetRecords<Employees>().ToList();

foreach (var item in records) 
     Console.WriteLine($"{item.FirstName} {item.LastName}"); //results as expected

context.AddRange(records);

await context.SaveChangesAsync();
await context.DisposeAsync();

CSV 文件:

FirstName;LastName
John;Doe

结果:

John Doe 在数据库中保存了两次。

预期结果:

John Doe 在数据库中只保存一次。

【问题讨论】:

  • 你可以试试 HasHeaderRecord = true, inside new CsvConfiguration?
  • 您似乎没有跳过标题行。
  • 那是可能的,但是为什么在VS中它有1个元素,但在数据库端有2个元素?编辑 - 结果仍然相同 - 值重复。
  • 故障排除 1. 删除 AddRange(records) 并查看是否有任何其他代码插入到您的数据库中。 2. 在你的 foreach 循环中使用 Add 并调试它。
  • 已经尝试在 foreach 循环中使用 AddAdd - 结果完全相同。除了仅使用Add 时出现异常(不能以这种方式在数据库中插入List)。

标签: c# csv entity-framework-core csvhelper


【解决方案1】:

这很奇怪。我试了一下,得到了相同的重复结果。如果我在代码中创建 records 列表而不使用 CsvHelper,我只会得到一个 John Doe。当我注意到其中一条记录具有 ReportsTo 的值以及第一条记录的 EmployeeId 时,我终于得到了一个线索。显然 CsvHelper 的 AutoMap 也在为 ReportsToNavigation 属性创建一个 Employees 记录。我认为这是 CsvHelper 中可能存在的错误。我唯一的解决方案是手动映射您需要的字段。

using var context = new NorthwindContext();
        
var csvConfig = new CsvConfiguration(CultureInfo.InvariantCulture)
{
    Delimiter = ";",
    HeaderValidated = null,
    MissingFieldFound = null
};

using var reader = new StreamReader("csvfile.csv");
using var csv = new CsvReader(reader, csvConfig);

csv.Configuration.RegisterClassMap<EmployeesMap>();

var records = csv.GetRecords<Employees>().ToList();

foreach (var item in records) 
     Console.WriteLine($"{item.FirstName} {item.LastName}"); //results as expected

context.AddRange(records);

await context.SaveChangesAsync();
await context.DisposeAsync();
public sealed class EmployeesMap : ClassMap<Employees>
{
    public EmployeesMap()
    {
        Map(m => m.FirstName);
        Map(m => m.LastName);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-28
    • 1970-01-01
    • 1970-01-01
    • 2022-09-29
    • 1970-01-01
    • 1970-01-01
    • 2020-07-22
    • 2019-05-02
    相关资源
    最近更新 更多