2014-11-06 8 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 в viewmodel.

я запускаю этот код: 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; }, он работает сразу, поэтому проблема заключается в автоматическом использовании с моей инкапсулированной коллекцией.


Update: Я также попытался это 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, потому что нет публичного сеттера.

Ваше решение изменить его к этому:

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

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

Хмм хорошо, но если я сделаю то, что происходит с моим инкапсулирования ICollection. Мне нужно будет провести несколько тестов. Это не идеальный вариант для того, чтобы требовать набора. Кроме того, зачем нужен установленный метод. Я проецирую этот тип не на этот тип. –

+0

Если вам нужен внешний компонент для его изменения, то это нормально, если у вас есть сеттер – Joanvo

+0

Да, но мне не нужен внешний компонент для его изменения, так как я проецирую _from_ этого типа на него. –

Смежные вопросы