如何使用快速成员将数据批量复制到具有不一致列名称的表中?

MaY*_*YaN 3 c# fastmember

我有一个Person包含以下列名的表:

Id,姓名,Dob

我也有一个poco:

public class Person
{
    public int Id {get; set;}
    public string Name {get; set;}
    public string DateOfBirth {get; set;}
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试:

var people = new List<Person>();
... // added a bunch of people

using (var bcp = new SqlBulkCopy(sqlConnection, SqlBulkCopyOptions.TableLock, transaction))
using (var reader = ObjectReader.Create(people, "Id", "Name", "Dob"))
{
    bcp.BulkCopyTimeout = 120;
    bcp.BatchSize = 0;
    bcp.DestinationTableName = "Person";
    bcp.WriteToServer(reader);
}
Run Code Online (Sandbox Code Playgroud)

但是,由于Column name Dob与属性名称不匹配,DateOfBirth我得到Index out of rangeFastMember抛出,如何在不重命名属性或列的情况下解决问题.

请注意,我需要一个只能在运行时使用属性和列名称的答案,因为我当前正在使用ServiceStack Ormlite在运行时检索表元数据,而FastMember则在运行时再次访问ObjectReader.

任何帮助深表感谢.

MaY*_*YaN 5

结果它结果比我想象的要简单得多:

// Get valid columns from the [targetTable] on the db at runtime
// and produce a simple mapping
// validColumns is an IDictionary<string, string>
var membersExposedToReader = validColumns.Keys.ToArray();

// data is an IEnumerable<T>           
using (var bcp = new SqlBulkCopy(sqlConnection, SqlBulkCopyOptions.TableLock, tran))
using (var reader = ObjectReader.Create(data, membersExposedToReader))
{
    foreach (var member in membersExposedToReader)
    {
        bcp.ColumnMappings.Add(member, validColumns[member]);
    }

    bcp.BulkCopyTimeout = 120;
    bcp.BatchSize = 0;
    bcp.DestinationTableName = targetTable;
    bcp.WriteToServer(reader);
}
Run Code Online (Sandbox Code Playgroud)