如何使用CSV Helper映射集合

时间:2016-08-08 15:28:20

标签: c# entity-framework csvhelper

public class Template : Entity
{
    public Template()
    {
        TemplateItems = new List<TemplateItem>();
    }

    public int id { get; set; }
    public string name { get; set; }
    public virtual ICollection<TemplateItem> TemplateItems { get; set; }
}


public class TemplateItem : Entity
{
    public int id { get; set; }
    public int templateId { get; set; }
    public string name { get; set; }
    public virtual Template Template { get; set; }
}


public sealed class TemplateMap : CsvClassMap<Template>
{
    public TemplateMap()
    {
        Map(m => m.name).Name("name");
        //Map(m => m.TemplateItems).ConvertUsing(row => new List<string> { row("nodeType") });

        // How to map a collection value to csv column 
    }
}

我正在读取CSV文件,需要将csv列映射到两个不同的表     我有两种不同的表格模型     即模板和templateitem     templateitem从模板映射         如何映射csv类?

1 个答案:

答案 0 :(得分:2)

目前这是不可能的。您需要手动处理集合。一种方法是使用ConvertUsing,如果你想将所有内容保存在映射文件中。

以下是一个例子:

void Main()
{
    using (var stream = new MemoryStream())
    using (var writer = new StreamWriter(stream))
    using (var reader = new StreamReader(stream))
    using (var csv = new CsvReader(reader))
    {
        writer.WriteLine("1,a,b,c");
        writer.WriteLine("2,d,e,f");
        writer.Flush();
        stream.Position = 0;

        csv.Configuration.HasHeaderRecord = false;
        csv.Configuration.RegisterClassMap<TestMap>();
        csv.GetRecords<Test>().Dump();
    }
}

public class Test
{
    public int Id { get; set; }
    public List<string> Names { get; set; } 
}

public class TestMap : CsvClassMap<Test>
{
    public TestMap()
    {
        Map(m => m.Id);
        Map(m => m.Names).ConvertUsing(row =>
        {
            var list = new List<string>();
            list.Add(row.GetField( 1 ));
            list.Add(row.GetField( 2 ));
            list.Add(row.GetField( 3 ));
            return list;
        });
    }
}