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);
}
}
我的代码:
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);
}
}