【发布时间】:2020-11-11 19:25:48
【问题描述】:
我正在尝试将测试数据从 CSV 文件加载到可以加载到 In-Memory EF Core DB 上下文中的记录中。
我有一个简化的实体,如下所示:
public class Project
{
public int { get; set; }
public Owner? Owner { get; set; } = null;
}
类地图:
public class ProjectsClassMap : CsvHelper.Configuration.ClassMap<Projects>
{
public ProjectsClassMap()
{
AutoMap(CultureInfo.CurrentCulture);
Map(m => m.Owner).Ignore();
}
}
然后是这样加载数据的函数:
private void LoadTestData<T>(string fileName, InMemoryEFCoreDbContext db, Type? classMap = null)
where T : class
{
var data = GetTestData(fileName);
var readerConfig = new CsvConfiguration(CultureInfo.CurrentCulture) {
Delimiter = ",",
PrepareHeaderForMatch = (r, c) => r.Replace(" ", string.Empty).ToLower(),
MissingFieldFound = (string[] values, int index, ReadingContext context) => { },
ReadingExceptionOccurred = (ex) => false,
HeaderValidated = (isValid, headerNames, headerNameIndex, context) => { },
HasHeaderRecord = true,
UseNewObjectForNullReferenceMembers = true,
};
if(classMap != null)
{
readerConfig.RegisterClassMap(classMap);
readerConfig.IgnoreReferences = true;
}
using (var sReader = new StringReader(data))
using (var csvReader = new CsvHelper.CsvReader(sReader, readerConfig))
{
var records = csvReader.GetRecords<T>().ToList();
db.Set<T>().AddRange(records);
db.SaveChanges();
}
}
问题是所有者设置为新值而不是默认值 null,这会在尝试保存到 DbContext 时导致验证错误。如何将复杂引用类型保留为 null 而不是 new?
【问题讨论】:
标签: csvhelper