C# 试图将.NET字符串[]映射到FastMember对象,但该对象出错/未映射

C# 试图将.NET字符串[]映射到FastMember对象,但该对象出错/未映射,c#,.net,sql-server,sqlbulkcopy,fastmember,C#,.net,Sql Server,Sqlbulkcopy,Fastmember,我正在尝试将文件名列表插入到一个简单的Sql Server表中 我正试图利用SqlBulkCopy和library,正如其他SO答案所建议的那样 public async Task AddFileNamesAsync(string[] fileNames) { fileNames.ShouldNotBeNull(); using (var bulkCopy = new SqlBulkCopy(ConnectionString)) { using (var

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

我正试图利用SqlBulkCopy和library,正如其他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列的名称不同,因此无法映射。
在查看GitHub源代码之前,我从未使用过这个库,因为它需要一个属性才能从源代码中查询。现在,在字符串上没有属性值,您需要使用的只是长度属性。使用长度。现在这可能是FastMember库的一个问题,它创建了一个CallSite访问器函数来从目标对象捕获属性

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

我的建议实际上并不是对这个问题的回答,而是使它发挥作用的一种方法。若您创建了一个具有字符串属性的类型,那个么您可以有效地解决这个问题

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)
            {

            }
        }
    }
}

现在,我们生成了一个新类型,该类型的属性值为每个文件名。现在,执行应该按预期工作。注意try..catch。。。只是为了测试。

我害怕这个建议的答案,因为那样我就有两份数据了。当然,我们不是在讨论大量的源字符串。。。但这是关键。这就是为什么我在作品中避免提及这一点。。。。。。。真倒霉但是是的。。。我的想法和这个答案是一样的。@Pure.Krome抱歉,如果不改变和重新编译FastMember的源代码,我就找不到另一种方法来破解它。我尝试了访问方法的方法,例如对字符串调用ToString,但它仅锁定到属性。没有问题:不过,我真的很感谢你抽出时间!您可以编写自己的IDataReader实现。SqlBulkCopy只调用读取器上的GetValue、Read和FieldCount实现,因此编写自定义读取器相对容易。只是一个想法。