C # Dapper y FastMember: método especificado no admitido

asp.net-core-2.0 c# dapper fastmember

Pregunta

Tengo un proyecto C # .NET Core 2.0 Web API (implementado como un microservicio).

Estoy usando NuGet Packages "Dapper" y "FastMember" (últimas versiones) en mi capa de repositorio para tratar de convertir un IEnumerable<T> a un DataTable a través del ObjectReader que proporciona FastMember, de modo que pueda aprovechar el built-in de Dapper ICustomQueryParameter SqlMapper para pasar un parámetro con valores de tabla a un procedimiento almacenado que estoy usando en SQL Server.

Cuando ejecuto y depuro mi código, arroja una excepción en la línea donde el FastMember ObjectReader intenta cargarse en una DataTable: table.Load(reader); .

Aquí está mi método de envoltura / extensión Dapper que contiene la línea problemática:

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);
        }
}

Aquí está mi llamada Dapper que utiliza el método de extensión anterior:

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

Y aquí está la traza de pila de mi excepción de C # que se lanzó:

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

El mensaje de excepción fue: El Specified method is not supported.

¿Alguien puede ayudarme con este error? No tiene sentido para mí que .NET Core 2.0 no sea compatible con este método. Y he utilizado FastMember en otras aplicaciones .NET Core 2.0 con éxito con SqlBulkCopy. Pero esta es la primera vez que intento usarlo con Dapper.

¡Cualquier ayuda es muy apreciada! Gracias por adelantado.

Respuesta aceptada

Esto es culpa de FastMember. Básicamente, durante mucho tiempo , la .NET Core API para ADO.NET no proporcionaba esta API en absoluto , lo que significaba que cualquier código que se dirigiera a ella no podría implementarla .

Esto ahora se ha rectificado en las versiones más nuevas de .NET Core, pero no he podido volver a FastMember para volver a agregar en la API. Intentaré hacer esto esta noche y obtener una nueva implementación lo antes posible.

Esencialmente, FastMember tiene:

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

porque: no pudo override un método que no existía en la clase base en ese momento.


Esto se ha solucionado en v1.2.0 cuando se orienta a plataformas de destino adecuadas, incluida netstandard2.0



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué