尝试将 .NET 字符串 [] 映射到 FastMember 对象,但它是 erroring/not 映射
Trying to map a .NET string[] to a FastMember object but it's erroring/not mapping
我正在尝试将文件名列表插入一个简单的 Sql 服务器 table。
我正在尝试利用 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 后备集合与数据库列的名称不同,因此无法映射。
我以前从未使用过这个库,但是查看 GitHub 源代码它需要 属性 才能从源代码中查询。现在在一个字符串上没有 属性 value
,你真正需要使用的是 Length
属性。使用 Length
。现在这可能是 FastMember 库的问题,它创建了一个 CallSite
访问器函数来从目标对象中捕获 属性。
现在我玩了一个游戏,但无法访问任何可用的 属性。乍一看,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...
只是为了测试)。
我正在尝试将文件名列表插入一个简单的 Sql 服务器 table。
我正在尝试利用 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 后备集合与数据库列的名称不同,因此无法映射。
我以前从未使用过这个库,但是查看 GitHub 源代码它需要 属性 才能从源代码中查询。现在在一个字符串上没有 属性 value
,你真正需要使用的是 Length
属性。使用 Length
。现在这可能是 FastMember 库的问题,它创建了一个 CallSite
访问器函数来从目标对象中捕获 属性。
现在我玩了一个游戏,但无法访问任何可用的 属性。乍一看,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...
只是为了测试)。