首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不支持C# Dapper和FastMember指定的方法

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

Stack Overflow用户
提问于 2018-01-31 16:14:18
回答 1查看 1.4K关注 0票数 4

我有一个C# .NET Core2.0WebAPI项目(作为一个微服务实现)。

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

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

下面是我的Dapper包装器/扩展方法,它包含有问题的行:

代码语言:javascript
复制
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调用:

代码语言:javascript
复制
using (var dbConnection = new SqlConnection(_connectionString))
{
    var result = dbConnection.Query("[PurchaseOrders].[Add] @tvpNewPurchaseOrderItems, @StartDate", new
    {
        tvpNewPurchaseOrderItems = purchaseOrderCreationRequest.PurchaseOrderItems.AsTvp("NewPurchaseOrderType"),
    StartDate = purchaseOrderCreationRequest.StartDate
    });
}

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

代码语言:javascript
复制
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 Core2.0不支持这种方法是没有意义的。我在其他的FastMember核心2.0应用程序中成功地使用了SqlBulkCopy。但这是我第一次尝试和Dapper一起使用它。

任何帮助都是非常感谢的!提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-31 20:03:28

这是费斯特恩伯的错。基本上,很长一段时间以来,.NET ADO.NET核心API根本没有提供这个API,这意味着任何针对它的代码都不能实现它。

这一点现在已经在新版本的.NET核心中得到了纠正,但我未能重新讨论FastMember以将其添加回API中。我今晚将尝试这样做,并尽快得到一个新的部署。

本质上,FastMember有:

代码语言:javascript
复制
#if !COREFX
    public override DataTable GetSchemaTable()
    {...}
#endif

因为:它不能override一个当时不存在于基类中的方法。

在针对合适的目标平台(包括netstandard2.0 )时,v1.2.0已经修正了这一点。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48546658

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档