我想將實體框架實體(從傳統數據庫生成)映射到自定義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是基於約定的,所以也許我應該使用另一個工具,但是哪一個存在?
感謝您的幫助!
我想你是映射內部數據庫查詢(LINQ),但不是最終對象本身(調用ToList後,第一,單等)。所以我想你應該首先查詢你的實體,然後嘗試映射。 – 2014-10-20 15:45:08
出於好奇,你使用'Mapper.Map(...)'來映射你的查詢,或者你正在從'Automapper.QueryableExtensions'下的Queryable Extensions命名空間中執行'.Project()。到()'? –
2014-10-20 15:46:55
我已經添加了一個使用示例的問題;我正在使用Project()。()來查詢。 – thomasb 2014-10-20 15:56:20