2012-08-06 75 views
3

我有一個REST風格的Web應用程序,首先使用EF代碼。我正在使用AutoMapper將我的類映射到DTO類以傳遞線路,並且(希望)返回。如何使用AutoMapper從DTO映射到實體框架代理類?

當我從POCO類映射到DTO時,實際上我是從EF代理對象開始的,因爲我正在處理的對象是對我的DataContext執行某種查詢的結果。但是,這似乎工作正常。

當我拿回DTO類作爲POST請求的一部分,我可以使用AutoMapper將其映射到我的POCO類,並正常工作了。

然而因爲AutoMapper僅僅是新的() - 荷蘭國際集團的POCO對象,而不是使用Create方法上EntitySet,我現在有一個POCO類,而不是相應的EF代理類。這使我很難將數據添加到我的數據庫等。

如何說服AutoMapper使用EntitySet.Create?還是有另一種方法來達到相同的結果?

+0

據我知道AutoMapper它不與工廠方法可擴展的方式有些IoC容器是。這將是一個完美的理由,但也許你必須自己貢獻它! – 2012-08-06 23:03:25

+0

我不知道遠遠不夠:http://stackoverflow.com/questions/2239143/automapper-how-to-map-to-constructor-parameters-instead-of-property-setters和http://stackoverflow.com /問題/ 11147347/automapper-使用最錯誤的構造函數。 – 2012-08-16 20:04:22

+0

@GertArnold:完美!你應該補充一點,作爲一個答案,我會接受它。 – 2012-08-16 20:20:30

回答

3

Map.CreateMap創建一個IMappingExpression對象,該對象具有一個方法ConstructUsing,該方法接受可以用作新對象的工廠方法的函數。映射的屬性用於設置值。 (順便說一下,這可以被ConvertUsing覆蓋)。

詳情請見Automapper - how to map to constructor parameters instead of property setters,AutoMapper using the wrong constructorHow to use Automapper to construct object without default constructor

你的情況,這可能是這樣的:

Mapper.CreateMap<TDto, TPoco>() 
    .ConstructUsing((Func<TDto, TPoco>) (c => context.CreateObject<TPoco>())) 
1

可能是你能做到這樣,

首先創建所需的對象,然後使用該實例映射DTO對象,

var poco=EntitySet.Create() 

Mapper.Map<DTOtype, POCOtype>(dto, poco); 
+0

是的,這看起來像一個單個對象的情況下,一個好的計劃。但是,我的對象具有其他對象的引用,我也希望將其轉換。 (例如,包含多個LineItem對象的Order對象)。在這種情況下,我認爲您的建議解決方案適用於Order對象,但不適用於LineItems? – 2012-08-07 08:59:03

0

假設你正在接受POCO對象在您的POST方法DTO像

[HttpPost] 
public ActionResult Save(Student std) 
{ 
    //do the stuff 
} 

的假設學生是EF代理類,但使用時ModelBinder的其綁定到表單中的值,它會創建新的對象不是那些ASSOC與數據上下文相關聯。所以首先是,如果你接受DTO的發佈,然後將它們轉換爲代理類,或者首先接受代理類,則沒有區別。 第二件事是,如果對象已經存在於數據庫中並且您剛剛使用automapper創建了它,則可以使用attach method與datacontext關聯。如果其新對象需要調用Add方法將其保存在數據庫中。

+0

我不確定我的理解。我的DTO比我的POCO對象(更少的字段等)簡單得多,所以我不能簡單地在我的ApiController方法中從DTO切換到POCO - 我確實需要「映射」它們。這就是我的問題的癥結所在 - 即如何將它們映射到我的POCO,但這些POCO是EF代理。 – 2012-08-07 09:03:02

+0

那麼,我所說的唯一的事情就是即使你設法在控制器中接收它們,它們也只是POCOs而不是EF代理。你必須使用它的附加方法(如果實體已經在數據庫中)或添加(如果實體是新的),用EF數據上下文附加它們。 – 2012-08-07 09:35:10

+0

我剛剛舉了一個例子,不建議在控制器方法簽名中使用db實體。 – 2012-08-07 09:36:24