尝试将.NET字符串[]映射到FastMember对象,但它是错误/不映射

时间:2017-03-03 02:23:58

标签: c# .net sql-server sqlbulkcopy fastmember

我正在尝试将文件名列表插入到简单的Sql Server表中。

我正在尝试利用SqlBulkCopy和@markgravell's FastMember库,正如其他SO答案所建议的那样。

public async Task AddFileNamesAsync(string[] fileNames)
{
    fileNames.ShouldNotBeNull();

    using (var bulkCopy = new SqlBulkCopy(ConnectionString))
    {
        using (var reader = ObjectReader.Create(fileNames))
        {
            bulkCopy.DestinationTableName = "FileNames";
            bulkCopy.ColumnMappings.Add("value", "FileName");
            await bulkCopy.WriteToServerAsync(reader)
                          .ConfigureAwait(false);
        }
    }
}

CREATE TABLE [dbo].[FileNames](
[FileNameId] [int] IDENTITY(1,1) NOT NULL,
[FileName] [varchar](500) NOT NULL

所以我觉得这是一个映射问题: - FastMember无法映射到某些内部支持集合 - FastMember支持集合与DB列的名称不同,因此无法映射。

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

我之前从未使用过这个库,但是在查看GitHub源代码之前它需要一个属性来从源查询。现在在字符串上没有属性value,实际上你必须使用的是Length属性。使用Length。现在,这可能是FastMember库的一个问题,它创建了一个CallSite访问器函数来从目标对象捕获属性。

Source here

现在我有一个游戏,无法访问任何可行的属性。乍一看,它们是Chars结果中返回的TypeAccessor属性,但这似乎不起作用。

我的建议并不是问题的答案,而是一种使其发挥作用的方法。如果你创建了一个具有字符串属性的类型,那么你可以有效地解决这个问题。

public async Task AddFileNamesAsync(string[] fileNames)
{
    fileNames.ShouldNotBeNull();

    var list = fileNames.Select(f => new { value = f });

    using (var bulkCopy = new SqlBulkCopy(ConnectionString))
    {
        using (var reader = ObjectReader.Create(list))
        {
            bulkCopy.DestinationTableName = "FileNames";
            bulkCopy.ColumnMappings.Add("value", "FileName");

            try
            {
                await bulkCopy.WriteToServerAsync(reader)
                                .ConfigureAwait(false);

            }
            catch(Exception ex)
            {

            }
        }
    }
}

现在这将起作用,因为我们生成了一个属性为value的新类型,它是每个文件名。现在执行应该按预期工作。 (注意try..catch...仅用于测试)。