Ich habe ein C # .NET Core 2.0 Web API Projekt (implementiert als Microservice).
Ich benutze NuGet Packages "Dapper" und "FastMember" (neueste Versionen) in meiner Repository-Schicht, um zu versuchen, ein IEnumerable<T>
über den von FastMember bereitgestellten ObjectReader in eine DataTable zu konvertieren, so dass ich die eingebauten Dapper nutzen kann ICustomQueryParameter SqlMapper, um einen Tabellenwertparameter an eine gespeicherte Prozedur zu übergeben, die ich in SQL Server verwende.
Wenn ich meinen Code ausführe und debugge, wird eine Ausnahme in der Zeile ausgelöst, in der der FastMember ObjectReader versucht wird, in eine DataTable geladen zu werden: table.Load(reader);
.
Hier ist meine Dapper Wrapper / Extension-Methode, die die problematische Zeile enthält:
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);
}
}
Hier ist mein Dapper-Aufruf, der die obige Erweiterungsmethode verwendet:
using (var dbConnection = new SqlConnection(_connectionString))
{
var result = dbConnection.Query("[PurchaseOrders].[Add] @tvpNewPurchaseOrderItems, @StartDate", new
{
tvpNewPurchaseOrderItems = purchaseOrderCreationRequest.PurchaseOrderItems.AsTvp("NewPurchaseOrderType"),
StartDate = purchaseOrderCreationRequest.StartDate
});
}
Und hier ist der Stack-Trace von meiner C # -Ausnahme, die geworfen wurde:
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
Ausnahmemeldung war: Specified method is not supported.
Kann mir jemand mit diesem Fehler helfen ?? Es macht für mich keinen Sinn, dass .NET Core 2.0 diese Methode nicht unterstützt. Und ich habe FastMember in anderen .NET Core 2.0-Anwendungen erfolgreich mit SqlBulkCopy verwendet. Aber das ist das erste Mal, dass ich es mit Dapper versucht habe.
Jede Hilfe wird sehr geschätzt! Danke im Voraus.
Dies ist die Schuld von FastMember. Im Grunde genommen für eine sehr lange Zeit, der .NET - Core - API für ADO.NET nicht diese API zur Verfügung stellte überhaupt, was bedeutete , dass jeder Code es Targeting nicht umsetzen kann.
Dies wurde jetzt in neueren Versionen von .NET Core behoben, aber ich habe es nicht geschafft, FastMember erneut zu besuchen, um es in der API hinzuzufügen. Ich werde versuchen, dies heute Abend zu tun und eine neue Bereitstellung so schnell wie möglich zu erledigen.
Im Wesentlichen hat FastMember:
#if !COREFX
public override DataTable GetSchemaTable()
{...}
#endif
weil: es konnte eine Methode, die zu der Zeit nicht in der Basisklasse existierte, nicht override
.
Dies wurde in v1.2.0 behoben, als Targeting auf geeignete Zielplattformen einschließlich netstandard2.0