簡體   English   中英

無法使用OData,EF Core和AutoMapper映射List <>導航屬性

[英]Unable to map List<> navigational properties using OData, EF Core and AutoMapper

我目前正在編寫一個使用OData進行查詢的ASP .NET Core API,並使用Entity Framework與數據庫進行通訊。

我想將域對象與發送給用戶的DTO分開,因此也開始使用AutoMapper將實體框架查詢結果轉換為我創建的DTO。

在這一點上(我正在測試時),我的DTO和域對象是相同的-只是公共getter / setter屬性。 DTO的示例如下:

    public class NoteDTO
    {
        public int Id { get; set; }
        public string Body { get; set; }
        public string Conclusion { get; set; }
        public string Title { get; set; }

        public ManagerDTO Manager { get; set; }
    }

    public class ManagerDTO
    {
        public int Id { get; set; }

        public virtual List<ProductDto> Products { get; set; }
    }

    public class ProductDto
    {
        public int Id { get; set; }
    }

我的NotesController中也有一個測試方法,用於獲取筆記(再次使用OData),如下所示:

        [HttpGet]
        [EnableQuery]
        public IQueryable<NoteDTO> GetMeeting()
        {
            var config = new MapperConfiguration(cfg =>
            {
                cfg.CreateMap<Note, NoteDTO>();
                cfg.CreateMap<Product, ProductDto>();
                cfg.CreateMap<Manager, ManagerDTO>()
                    .ForMember(md => md.Products, conf => conf.MapFrom(m => m.Products));
            });
            return _context.Notes.ProjectTo<NoteDTO>(config);
        }

然后,我嘗試使用以下查詢命中我的API:

https:// localhost:5001 / api / Notes ?$ select = Id,Body,Conclusion&$ top = 5&$ expand = Manager($ select = Id)

但是,這失敗了,並且在堆棧跟蹤中,我得到以下錯誤消息:

System.ArgumentException: Expression of type 'System.Collections.Generic.IEnumerable`1[System.Tuple`3[TestEntityFramework.DataObjects.ProductDto,Microsoft.EntityFrameworkCore.Query.Internal.MaterializedAnonymousObject,Microsoft.EntityFrameworkCore.Query.Internal.MaterializedAnonymousObject]]' cannot be used for parameter of type 'System.Collections.Generic.IEnumerable`1[TestEntityFramework.DataObjects.ProductDto]' of method 'System.Collections.Generic.IEnumerable`1[TestEntityFramework.DataObjects.ProductDto] _ToEnumerable[ProductDto](System.Collections.Generic.IEnumerable`1[TestEntityFramework.DataObjects.ProductDto])'

如果我從ManagerDTO對象和相關的產品映射配置中刪除列表,則上面的查詢將成功工作。

我在GitHub問題上看到了類似問題的評論,但是嘗試實施該建議並沒有幫助(假設我正確理解了它們): https : //github.com/AutoMapper/AutoMapper/issues/ 2853#issuecomment-482317381

還有其他人遇到這個問題嗎? 我仍然習慣於使用AutoMapper,因此可能錯過了一些顯而易見的事情,但是從周圍進行搜索似乎是一個相當不常見的問題,因此很難找到關於這里發生的事情的指針。

對於將OData查詢轉換為實體框架,然后再轉換為DTO的最佳方法,我還有其他建議,如果我在這里做的不是最佳選擇!

您是否正在使用Automapper集合擴展? 如果沒有,這應該可以解決您的問題: https : //github.com/AutoMapper/AutoMapper.Collection

暫無
暫無

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

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