2014-11-06 30 views
0

我使用Automapper從EF實體映射到查看模型。帶封裝子集合的自動映射投影(EF)

我現在有這個實體

public class MenuGroup : IEntity 
{ 
    public int MenuGroupId { get; set; } 

    protected ICollection<MenuGroupItem> _menuGroupItems { get; set; } 
    public IEnumerable<MenuGroupItem> MenuGroupItems { get { return _menuGroupItems; } } 

    public void AddMenuItem(MenuGroupItem menuGroupItem) 
    { 
     _menuGroupItems.Add(menuGroupItem); 
    } 
} 

這是一個封裝的集合,我也跟着指導這裏,使這項工作:http://lostechies.com/jimmybogard/2014/05/09/missing-ef-feature-workarounds-encapsulated-collections/

所以我配置它,像這樣this.HasMany(x => x.MenuGroupItems).WithRequired(x => x.BelongsTo).WillCascadeOnDelete(true);

現在的問題我得到的是當我嘗試使用automapper將我的MenuGroup映射到視圖模型。

我運行此代碼:menuGroup = _context.MenuGroups.Project().To<MenuGroupEditModel>().Single(x => x.UniqueUrlFriendlyName == request.UniqueUrlFriendlyName);

,並得到這個錯誤:The specified type member 'MenuGroupItems' is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported.


現在我可以與收集工作,它正確地保存到數據庫中,一切都很好那裏只有當我想在這裏使用automapper,它失敗了。

如果我用簡單的代替受保護的ICollection和公共IEnumerable:public ICollection<MenuGroupItem> MenuGroupItems { get; set; }它可以馬上工作,所以問題在於我的封裝集合自動映射。


更新:我也試過這個menuGroup = _context.MenuGroups.Include(x => x.MenuGroupItems).Where(x => x.UniqueUrlFriendlyName == request.UniqueUrlFriendlyName).Project().ToSingleOrDefault<MenuGroupEditModel>();比它在ToSingleOrDefault差錯,而不是其他的沒有什麼區別。

回答

0

經過一些調試我想通了配置文件看起來像這樣

public MenuGroupConfiguration() 
    { 
     this.HasMany(x => x.MenuGroupAssigments).WithRequired(x => x.BelongTo).WillCascadeOnDelete(true); 

     this.HasMany(x => x.MenuGroupItems).WithRequired(x => x.BelongsTo).WillCascadeOnDelete(true); 
    } 

沒有被列入導致的錯誤,現在讓感。


我可以添加作爲一般的提示,如果你不使用自動映射爲一個查詢,但仍然使用您的收藏封裝記住,你必須調用編譯爲它工作。

像這樣

 var menuGroupsWithType = 
      _context.MenuGroups.Include(x => x.MenuGroupItems).Include(x => x.MenuGroupAssigments).Where(x => x.MenuGroupAssigments.Any(y => y.AssignToAll == selectedStructureType)) 
       .OrderBy(x => x.Name).Decompile().ToList(); 
1

您的問題是Automapper無法修改MenuGroupItems,因爲沒有公共setter。

你的解決方案是將其更改爲這樣:

public IEnumerable<MenuGroupItem> MenuGroupItems { get; set; } 

public void AddMenuItem(MenuGroupItem menuGroupItem) 
{ 
    MenuGroupItems.Add(menuGroupItem); 
} 
+0

嗯,不錯,但如果我那麼做會發生什麼我將ICollection的封裝。我將不得不運行一些測試。被迫需要一套設備並不理想。另外,它爲什麼需要一套方法。我從這個類型項目不是這種類型。 – 2014-11-09 11:23:49

+0

如果你需要一個外部組件來修改它,那麼通常有一個setter – Joanvo 2014-11-09 11:35:40

+0

是的,但我不需要一個外部組件來修改它,因爲我從這個類型投影它不是它。 – 2014-11-09 14:47:26