2014-10-20 40 views
4

我想將實體框架實體(從傳統數據庫生成)映射到自定義DTO對象(應該很好,乾淨)。具有不同屬性類型的AutoMapper對象

我的遺產DB具有看起來有點像這樣的實體:

internal class Order { 
    int id; 
    string Shipping_date; 
    string quantity; 
} 

而且我想把它映射到一個更好的DTO對象:

public class OrderDto { 
    int id; 
    DateTime? ShippingDate; 
    int Quantity; 
} 

我寫了「實體容器」來提供依賴注入,它以這種方式返回值:

public IEnumerable<OrderDto> GetPaginatedOrders(int page, int pageSize) 
{ 
    return this.db.Orders 
       .OrderByDescending(c => c.id) 
       .Paginate(page, pageSize) 
       .Project() 
       .To<OrderDto>() 
       .AsEnumerable(); 
} 

所以:改變類型,改變p屬性名稱。

是隻屬性名稱的變化,這將是容易但很繁瑣:

Mapper.CreateMap<Order, OrderDto>() 
    .ForMember(dest => dest.Quantity, opt => opt.MapFrom(src => src.quantity)) 
    .ForMember(dest => dest.ShippingDate, opt => opt.MapFrom(src => src.Shipping_date)); 

這還不足以與類型的變化。我試了一大堆東西:

  • 解析映射聲明的屬性,如src => int.Parse(src.quantity),但Linq不喜歡它。
  • 使用自定義屬性(如QuantityInt { get { return int.Parse(this.quantity) } })擴展EF實體並在映射中使用這些實體,但AutoMapper不喜歡它,並且明確不支持它們。
  • 將系統類型映射到另一個像Mapper.CreateMap<string, int>().ConvertUsing(Convert.ToInt32)但我仍然得到Unable to create a map expression from System.String to System.Int32錯誤。
  • 使用自定義轉換器爲我的類,但我總是從我的實體運行時從ResolutionContext.SourceValues空值(我猜他們是在AutoMapper獲得它們之前處置或類似的東西)。

我意識到AutoMapper是基於約定的,所以也許我應該使用另一個工具,但是哪一個存在?

感謝您的幫助!

+0

我想你是映射內部數據庫查詢(LINQ),但不是最終對象本身(調用ToList後,第一,單等)。所以我想你應該首先查詢你的實體,然後嘗試映射。 – 2014-10-20 15:45:08

+0

出於好奇,你使用'Mapper.Map (...)'來映射你的查詢,或者你正在從'Automapper.QueryableExtensions'下的Queryable Extensions命名空間中執行'.Project()。到()'? – 2014-10-20 15:46:55

+0

我已經添加了一個使用示例的問題;我正在使用Project()。()來查詢。 – thomasb 2014-10-20 15:56:20

回答

2

.Project()將Linq用於生成SQL的實體,並且自然只理解非常有限的一組函數。

如果使用

Mapper.Map<IEnumerable<Order>, IEnumerable<OrderDto>>(src) 

您的轉換將正常工作。

+0

轉換工作正常,但是你放棄了'.Project()'的所有好處。 – 2014-10-20 16:31:07

+0

如何將這與我的枚舉數一起使用? – thomasb 2014-10-20 16:32:19

+0

Mapper.Map ,IEnumerable >(src) – severin 2014-10-20 16:32:53

相關問題