簡體   English   中英

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

[英]C# Dapper and FastMember - Specified method not supported

我有一個C#.NET Core 2.0 Web API項目(作為微服務實現)。

我在我的存儲庫層中使用NuGet Packages“Dapper”和“FastMember”(最新版本)嘗試通過FastMember提供的ObjectReader將IEnumerable<T>轉換為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不支持這種方法是沒有意義的。 我已經使用SqlBulkCopy在其他.NET Core 2.0應用程序中成功使用了FastMember。 但這是我第一次嘗試將它與Dapper一起使用。

任何幫助深表感謝! 提前致謝。

這是FastMember的錯。 基本上, 很長一段時間 ,對ADO.NET的.NET核心API沒有提供這個API的所有,這意味着任何代碼針對它無法實現它

現在已經在較新版本的.NET Core中對此進行了修正,但我沒有重新訪問FastMember以在API中添加。 今晚我會盡力做到這一點並盡快獲得新的部署。

基本上,FastMember有:

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

因為:它無法override當時基類上不存在的方法。


在針對包括netstandard2.0在內的合適目標平台時,已在v1.2.0中修復此netstandard2.0

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM