[英]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.