CsvHelper:初始化地图成员

时间:2019-06-26 23:45:39

标签: c# entity-framework csvhelper

想象一下这样的EF dbSet集合:

public class Employee {
  ...
  public string FirstName { get; set; }
  public List<Badge> Badge { get; set; } 
}

public class Badge {
  public long CSN { get; set; }
  public int EmployeeId { get; set; }
  public int Type { get; set; }
}

此模型在我的SGBB中使用,我想用它从CSV文件导入数据。但是此文件有很小的区别。它只给出一个这样的徽章:

FIRSTNAME;CSN;TYPE
Jerome;12345;1

我使用了CollectionGenericConverter来用新记录初始化列表。

Map(m => m.Firstname).Name("Firstname");
Map(m => m.Badges).Name("CSN").TypeConverter<BadgeConverter>();

...

public class BadgeConverter : CollectionGenericConverter {
   public override object ConvertFromString(String text, IReaderRow row, MemberMapData memberMapData) {
       return new List<Badge> {
           new Badge {
               CSN = Convert.ToInt16(text)
           }
       };
   }
}

我对第二个值有问题,使用第二个转换器重置徽章列表:

 Map(m => m.Badges).Name("Type").TypeConverter<AnotherOneBadgeConverter>();

直接设置第一项无效:

 Map(m => m.Badges[0].Type).Name("Type");

该怎么做?

1 个答案:

答案 0 :(得分:1)

类似的事情可能对您有用。

public class Program
{
    public static void Main(string[] args)
    {
        using (MemoryStream stream = new MemoryStream())
        using (StreamWriter writer = new StreamWriter(stream))
        using (StreamReader reader = new StreamReader(stream))
        using (CsvReader csv = new CsvReader(reader))
        {
            writer.WriteLine("FIRSTNAME;CSN;TYPE");
            writer.WriteLine("Jerome;12345;1");
            writer.Flush();
            stream.Position = 0;

            csv.Configuration.Delimiter = ";";
            csv.Configuration.RegisterClassMap<EmployeeMap>();

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

public class Employee
{  
    public string FirstName { get; set; }
    public List<Badge> Badge { get; set; }
}

public class Badge
{
    public long CSN { get; set; }
    public int EmployeeId { get; set; }
    public int Type { get; set; }
}

public class EmployeeMap: ClassMap<Employee>
{
    public EmployeeMap()
    {
        Map(m => m.FirstName).Name("FIRSTNAME");
        Map(m => m.Badge).ConvertUsing(row =>
        {
            var list = new List<Badge>
            {
                new Badge { CSN = row.GetField<long>("CSN"), Type = row.GetField<int>("TYPE") },
            };
            return list;
        });
    }
}