将动态csv文件映射到EF实体

时间:2015-10-09 21:38:52

标签: c# entity-framework dictionary csvhelper

我一直在使用EF并使用CsvHelper将测试输出直接映射到数据库实体以便快速存储。我现在遇到一个跟踪cpu核心,端口io和核心/端口配对数据的性能监视器的问题。我可以拥有任意数量的内核和任意数量的端口,这些端口在核心/端口配对中成倍增加。输出是csv格式,我无法控制这种输出格式。

我需要有效地将这个动态列大小的csv扫描到实体模型中。我希望我可以用最少的操作将列映射到各个表。

EF的POCO配对示例:

public class CpuTesting
{
    [Key]
    public int Id { get; set; }
    public int Socket { get; set; }
    public int Core { get; set; }
    public double ProcessorTime { get; set; }

    public virtual ICollection<PortCorePairing> PortCorePairings { get; set; } 
}

public class PortIo
{
    [Key]
    public int Id { get; set; }
    public Int64 BytesReceivedTotal { get; set; }
    public Int64 BytesSentTotal { get; set; }
}

public class PortCorePairing
{
    [Key]
    public int Id { get; set; }
    public int CpuTestingId { get; set; }
    public int InteruptPerSecond { get; set; }
    public int DiscardedSent { get; set; }
    public int DiscardedReceived { get; set; }

    [ForeignKey("CpuTestingId")]
    public virtual CpuTesting CpuTesting { get; set; }
}

大量简化的标题行,它映射到(相信我,它是释义...我通常处理200+列的单个端口测试,这就是为什么我希望找到更好的方法映射)。

Cpu(0,0) ProcTime, Cpu(0,1) ProcTime, Cpu(1,0) ProcTime, Cpu(1,1) ProcTime, Port(0) BytesRecTotal, Port(0) BytesSentTotal, Port(1) BytesRecTotal, Port(1) BytesSentTotal, Cpu(0,0) Port(0) CoreIntPerSec, Cpu(0,0) Port(0) Discarded, Cpu(0,1) Port(0) CoreIntPerSec, Cpu(0,1) Port(0) Discarded, Cpu(1,0) Port(1) CoreIntPerSec, Cpu(1,0) Port(1) Discarded, Cpu(1,1) Port(1) CoreIntPerSec, Cpu(1,1) Port(1) Discarded

现在,我看到这一点的唯一方法是预处理标题行以解析集合中的列(按索引映射),通过csv文件迭代进展。这有很多开销,涉及映射和自动映射。标题会在多个位置更改文本,这使得映射需要键入标题中的子字符串。

上面的CSV标题仅为模式示例: 包含的csv标题只是问题的修剪模式。如果我更改端口的品牌/型号,我会获得端口的新名称,而不是端口。正在测试的下一个系统可能每个CPU有12个核心和/或4个端口。从字面上看,我现在面前有一个数据集,有4个cpus @ 12核心ea。,4个端口,配对最终接近1200列。

0 个答案:

没有答案