2015-03-07 2 views
1

Я использую automapper для сопоставления своих объектов с viewmodel и формы viewmodel обратно в объект в поездке обратно из представления.Automapper с MVC и модифицированными вложенными объектами - как их обновить

У меня есть небольшая проблема, у меня есть список вложенных сущностей в моем измененном объекте, который можно изменить в представлении. Когда я сохраняю основной объект, даже если все кажется правильно отображенным в его вложенных объектах, вложенные объекты не обновляются (в консоли не отображаются связанные с ними SQL-инструкции).

Я уверен, что есть кое-что, что я пропустил, чтобы убедиться, что EF знает, что они были изменены.

Единственное, что я нашел, чтобы уведомить рамки сущности были изменены (даже если не все из них) в моем контроллере:

Database.Entry(character).State = EntityState.Modified; 
foreach(CharacterAbilityScore cab in character.CharacterAbilityScores) 
    Database.Entry(cab).State = EntityState.Modified; 

Если я правильно помню, когда я был с помощью сущности вместо ViewModels в моем представлении, мне не нужно было уведомлять EF о том, что вложенные объекты были изменены, он знал и обновлял базу данных соответственно.

Я просто хочу убедиться, что у меня правильный подход.

Сообщите мне, если вам нужно больше кода!

UPDATE:

Это, как я настроил automapper:

Mapper.CreateMap<CharacterViewModel, Character>() 
    .ForMember(dest => dest.CharacterAbilityScores, opt => opt.MapFrom(src => src.CharacterAbilityScoresDTO)); 

Окончательная обновление, ответ:

Так как я нахожусь в режиме MVC, и контекст воссозданный когда мы возвращаемся из сообщения в представлении, мне нужно вручную управлять тем, как мои дочерние сущности изменились, либо с объектами самопроверки, либо как я, отметив их изменения w Я знаю, что они, вероятно, будут. Это приведет к немного больше обновлений, чем необходимо.

ответ

0

Так как я нахожусь в MVC mode, и контекст воссоздается, когда я возвращаюсь из сообщения в представлении, Entity Framework может отслеживать только родительский объект, а не вложенные.

Так что мне нужно вручную управлять тем, как изменились мои дочерние сущности, либо с объектами самостоятельного отслеживания, либо такими, как я, отметив их изменения, когда я знаю, что они, вероятно, будут. Это приведет к немного больше обновлений, чем необходимо.

Таким образом, используя самообучающиеся объекты (см. Это сообщение в блоге) http://blog.tonysneed.com/2013/11/18/trackable-entities-versus-self-tracking-entities/ или отметили их как «измененные», как в моем первоначальном вопросе (что приводит к большему количеству обновлений, чем это необходимо, может быть приемлемым, если все еще небольшая сумма) ,

2

Вам необходимо отобразить свою коллекцию независимо от вашей основной сущности. В противном случае AutoMapper заменяет всю коллекцию сопоставленными классами вместо фактического сопоставления новых значений с существующими элементами.

В вашей конфигурации, скажите AutoMapper игнорировать вашу коллекцию при отображении:

AutoMapper.Mapper.CreateMap<CharacterViewModel, Character>() 
    .ForMember(dest => dest.CharacterAbilityScores, opts => opts.Ignore()); 

Затем сопоставьте размещены данные в два этапа в своем действии:

AutoMapper.Mapper.Map(model, character); 
foreach (var item in model.CharacterAbilityScores) 
{ 
    var existingItem = character.CharacterAbilityScores.SingleOrDefault(m => m.Id == item.Id); 
    if (existingItem == null) 
    { 
     character.CharacterAbilityScores.Add(AutoMapper.Mapper.Map<CharacterAbilityScore>(item)); 
    } 
    else 
    { 
     AutoMapper.Mapper.Map(item, existingItem); 
    } 
} 
+0

Ну, это не весело ... :) Удивительно, что даже если коллекция была правильно сопоставлена ​​в сущности с моей конфигурацией отображения, EF не смог заставить их обновить сам по себе, знаете ли вы, есть ли причина ? –

+0

Это из-за отслеживания объекта EF. Путем сопоставления совершенно новой коллекции вместо старой, вы сообщаете EF, что она должна удалить все эти старые элементы, а затем добавить эти новые элементы. Путем ручной настройки состояния для изменения вы вызываете EF для присоединения этих новых элементов и вместо этого переключаетесь в режим обновления. –

+0

Крис, когда я не заметил EF, чтобы изменить его, он не делал ничего с коллекцией. Нет удалений и воссозданий, обновлений, ничего. Вот почему я немного потерян. Я также считаю довольно странным, что я не могу автоматизировать дочерние объекты (я обновил свой вопрос, чтобы добавить, как я настроил для этого automapper) –

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