CSV Helper有条件地将Membermap应用于子对象

时间:2019-06-27 10:13:56

标签: c# entity-framework-core csvhelper

我正在使用CSV帮助器库将CSV数据映射到我的实体对象,然后使用实体在我的数据库中创建记录。

该地图非常适合新对象。在我有一个现有子对象的地方,它正在创建子对象,这导致实体中的键名重复。

我想根据位置ID是否存在或空来有条件地应用子成员地图的创建。

这将允许我的实体代码执行

public sealed class StopCsvMapper : ClassMap<Stop>
{
    public StopCsvMapper()
    {
        Map(m => m.Id).Name("Id").Default(Guid.Empty);
        Map(m => m.Identifier).Name("Identifier");
        Map(m => m.Name).Name("Name");               
        Map(m => m.LocationId).Name("LocationId").Default(Guid.Empty);

        References<StopLocationCsvMapper>(m => m.Location);
    }
}

public class StopLocationCsvMapper : ClassMap<Location>
{
    public StopLocationCsvMapper()
    {
        Map(m => m.Id).Name("LocationId").Default(Guid.Empty);
        Map(m => m.Name).Name("LocationName");
        Map(m => m.Notes).Name("LocationNotes");
        Map(m => m.Latitude).Name("LocationLatitude");
        Map(m => m.Longitude).Name("LocationLongitude");
    }
}

1 个答案:

答案 0 :(得分:0)

这应该仅在LocationId为空时有条件地创建子记录。

public sealed class StopCsvMapper : ClassMap<Stop>
{
    public StopCsvMapper()
    {
        Map(m => m.Id).Name("Id").Default(Guid.Empty);
        Map(m => m.Identifier).Name("Identifier");
        Map(m => m.Name).Name("Name");

        Map(m => m.Location).ConvertUsing(row =>
        {
            if (row.GetField("LocationId") != string.Empty)
            {
                return null;
            }
            else
            {
                return new Location
                {
                    Id = Guid.Empty,
                    Name = row.GetField("LocationName"),
                    Notes = row.GetField("LocationNotes"),
                    Latitude = row.GetField("LocationLatitude"),
                    Longitude = row.GetField("LocationLongitude"),
                };
            }
        });
    }
}