gpt4 book ai didi

C# Dapper 和 FastMember - 不支持指定的方法

转载 作者:太空狗 更新时间:2023-10-30 01:29:58 28 4
gpt4 key购买 nike

我有一个 C# .NET Core 2.0 Web API 项目(作为微服务实现)。

我在我的存储库层中使用 NuGet 包“Dapper”和“FastMember”(最新版本)来尝试转换 IEnumerable<T>通过 FastMember 提供的 ObjectReader 到 DataTable,这样我就可以利用 Dapper 的内置 ICustomQueryParameter SqlMapper 将表值参数传递到我在 SQL Server 中使用的存储过程。

当我执行和调试我的代码时,它在 FastMember ObjectReader 试图加载到 DataTable 的那一行抛出异常:table.Load(reader); .

这是我的 Dapper 包装器/扩展方法,其中包含有问题的行:

public static class DapperExtensions
{
public static SqlMapper.ICustomQueryParameter AsTvp<T>(this
IEnumerable<T> enumerable, string typeName) where T : class
{
var table = new DataTable();
var members = typeof(T).GetProperties().Select(p => p.Name).ToArray();
using (var reader = ObjectReader.Create(enumerable.ToList(), members))
{
table.Load(reader);
}
return table.AsTableValuedParameter(typeName);
}
}

这是我使用上述扩展方法的 Dapper 调用:

using (var dbConnection = new SqlConnection(_connectionString))
{
var result = dbConnection.Query("[PurchaseOrders].[Add] @tvpNewPurchaseOrderItems, @StartDate", new
{
tvpNewPurchaseOrderItems = purchaseOrderCreationRequest.PurchaseOrderItems.AsTvp("NewPurchaseOrderType"),
StartDate = purchaseOrderCreationRequest.StartDate
});
}

下面是我抛出的 C# 异常的堆栈跟踪:

at System.Data.Common.DbDataReader.GetSchemaTable()
at System.Data.ProviderBase.SchemaMapping..ctor(DataAdapter adapter, DataSet dataset, DataTable datatable, DataReaderContainer dataReader, Boolean keyInfo, SchemaType schemaType, String sourceTableName, Boolean gettingData, DataColumn parentChapterColumn, Object parentChapterValue)
at System.Data.Common.DataAdapter.FillMappingInternal(DataSet dataset, DataTable datatable, String srcTable, DataReaderContainer dataReader, Int32 schemaCount, DataColumn parentChapterColumn, Object parentChapterValue)
at System.Data.Common.DataAdapter.FillMapping(DataSet dataset, DataTable datatable, String srcTable, DataReaderContainer dataReader, Int32 schemaCount, DataColumn parentChapterColumn, Object parentChapterValue)
at System.Data.Common.DataAdapter.FillFromReader(DataSet dataset, DataTable datatable, String srcTable, DataReaderContainer dataReader, Int32 startRecord, Int32 maxRecords, DataColumn parentChapterColumn, Object parentChapterValue)
at System.Data.Common.DataAdapter.Fill(DataTable[] dataTables, IDataReader dataReader, Int32 startRecord, Int32 maxRecords)
at System.Data.DataTable.Load(IDataReader reader, LoadOption loadOption, FillErrorEventHandler errorHandler)
at System.Data.DataTable.Load(IDataReader reader)
at PurchaseOrderCreationRepositories.Extensions.DapperExtensions.AsTvp[T](IEnumerable`1 enumerable, String typeName) in C:\Projects-Git\Enterprise\PurchaseOrderCreationService\PurchaseOrderCreationRepositories\Extensions\DapperExtensions.cs:line 16
at PurchaseOrderCreationRepositories.PurchaseOrderRepository.Add(IPurchaseOrderCreationRequest purchaseOrderCreationRequest) in C:\Projects-Git\Enterprise\PurchaseOrderCreationService\PurchaseOrderCreationRepositories\PurchaseOrderRepository.cs:line 22
at PurchaseOrderCreationServices.PurchaseOrderService.Add(IPurchaseOrderCreationRequest purchaseOrderCreationRequest) in C:\Projects-Git\Enterprise\PurchaseOrderCreationService\PurchaseOrderCreationServices\PurchaseOrderService.cs:line 18
at PurchaseOrderCreationServiceApi.Controllers.PurchaseOrderCreationController.Add(PurchaseOrderCreationRequest purchaseOrderCreationRequest) in C:\Projects-Git\Enterprise\PurchaseOrderCreationService\PurchaseOrderCreationServiceApi\Controllers\PurchaseOrderCreationController.cs:line 25

异常消息是:Specified method is not supported.

谁能帮我解决这个错误?? .NET Core 2.0 不支持这种方法对我来说没有意义。我已经在其他 .NET Core 2.0 应用程序中使用 SqlBulkCopy 成功地使用了 FastMember。但这是我第一次尝试将它与 Dapper 一起使用。

非常感谢任何帮助!提前致谢。

最佳答案

这是 FastMember 的错。基本上,很长一段时间,用于 ADO.NET 的 .NET Core API 根本不提供此 API,这意味着任何以它为目标的代码无法实现

此问题现已在较新版本的 .NET Core 中得到纠正,但我未能重新访问 FastMember 以重新添加到 API 中。我今晚会尝试这样做,并尽快进行新的部署。

本质上,FastMember 具有:

#if !COREFX
public override DataTable GetSchemaTable()
{...}
#endif

因为:它无法覆盖当时基类上不存在的方法。


当目标合适的目标平台包括 netstandard2.0

时,此问题已在 v1.2.0 中修复

关于C# Dapper 和 FastMember - 不支持指定的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48546658/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com