2016-04-29 96 views
1

我在使用Automapper Projections的應用程序中處理自引用模型時遇到問題。這是我的模型如何:Automapper自引用模型投影

public class Letter 
{ 
    public int? ParentId {get; set;} 

    public Letter ParentLetter {get; set; 

    public int Id {get; set;} 

    public string Title {get; set;} 

    public string Content {get; set;} 

    public DateTime? ReceivedTime {get; set;} 

    public DateTime? SendingTime {get; set;} 

    public List<Destination> Destinations {get; set;} 

    public List<Letter> Responses {get; set;} 
} 

public class LetterView 
{ 
    public int? ParentId {get; set;} 

    public int Id {get; set;} 

    public string Title {get; set;} 

    public string Content {get; set;} 

    public DateTime? ReceivedTime {get; set;} 

    public DateTime? SendingTime {get; set;} 

    public List<DestinationView> Destinations {get; set;} 

    public List<LetterView> Responses {get; set;} 
} 


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

    public string Name {get; set;} 

    .. 
} 

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

    public string Name {get; set;} 
} 

// The mapping: 

CreateMap<Destination, DestinationView> 
CreateMap<Letter, LetterView> 

我的問題是與信件映射到LetterView。問題出在答覆處,我無法弄清楚應該改變什麼。

無論何時運行單元測試和斷言映射配置一切正常,以及映射帶有對視圖模型的多個響應的字母。然而,每當我從數據庫(實體框架6)得到一個帶有resposnes的字母時,對LetterView的投影就拋出一個stackoverflow異常。

任何人都可以請解釋爲什麼這隻發生在投影?我應該改變什麼?

+0

您是否有堆棧溢出的堆棧跟蹤? –

回答

0

您可能在您的DbContext上啓用了lazy loading。循環引用可能會產生堆棧溢出異常。爲了避免它,最好的辦法是禁用延遲加載:

context.ContextOptions.LazyLoadingEnabled = false; 
// Bring entity from database then reenable lazy loading if needed 
context.ContextOptions.LazyLoadingEnabled = true; 

但是,您將需要include所有所需導航性能,因爲當延遲加載被禁用的EntityFramework不會將他們帶回。如果您需要其他請求,請不要忘記重新啓用它。

1

這裏有幾個選項,但通常最好的選擇是在響應上設置最大深度。 AutoMapper將嘗試蜘蛛的屬性,並且你有一個自引用的DTO。首先試試這個:

CreateMap<Letter, LetterView>() 
    .ForMember(d => d.Responses, opt => opt.MaxDepth(3)); 

另一種選擇是預先連接你的DTOs特定的深度。你會創建一個LetterView和一個ChildLetterView。您的ChildLetterView不會有「響應」屬性,在您的DTO端爲您提供正好2級的深度。您可以根據需要設置深度,但在父級/子級/孫級/偉大數學類型名稱的層次結構中的DTO類型中可以非常明確。

+0

我想要大量的深度級別,因此在這裏用不同的對象來設置這個顯式不會很好。我嘗試設置最大深度 - 無法在ForMember上找到它,只能在地圖上找到它。設置最大長度時,我得到異常 - 值不能爲空,參數名稱:body –

+0

另外我不知道它是否會影響問題,但我也有一個父母的信,我將它添加到問題中描述的模型 –