EF Core:发送到数据库的重复值

EF Core : duplicate values sent to database

我的代码:

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 在数据库中只保存了一次。

这很奇怪。我试过了,得到了相同的重复结果。如果我在代码中创建 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);
    }
}