4

У меня есть устройство класса следующим образом.EF как обновить объект, содержащий список объектов

public class Device 
{ 
    public string id { get; set; } 
    public string name { get; set; } 
    public List<Instructions> Instructions { get; set; } 
} 

Теперь у меня есть представление, в котором есть разделы, относящиеся к устройству, и предоставление для добавления Instrunctions на устройство.

Если устройство новое, то this.context.Devices.Add(device) работает нормально.

, но если я хочу отредактировать устройство. Я нахожу его по Id. Он заселен. и если я изменю индивидуальное свойство, тогда он работает нормально. но я хочу обновить сразу все устройство, чего не происходит.

Мой образец кода выглядит следующим образом.

public async Task<bool> AddInstrument(Device device) 
{ 
    try 
    { 
     var newDevice = this.context.Device 
         .Where(i => i.Id == device.Id).FirstOrDefault();// i tried find,single or default also 

     //adding new device 
     if (newDevice == null) 
     { 
      this.context.Device.Add(device); 
      return await this.context.SaveChangesAsync() > 0; 
     } 

     //if editing the device 
     newDevice = device; 
     return await this.context.SaveChangesAsync() > 0; 
    } 
    catch 
    { 
     throw; 
    } 
} 

что я хочу достичь.

проблема: - Я хочу обновить соответствующее устройство в базе данных. наряду с инструкциями. , например. Ранее устройство под названием «D22» имеет 3 инструкции (a1, a2, a3).

, но теперь одно и то же устройство имеет значения «D22_1», а теперь инструкции a1, a3 (обновлено любое поле), a2 (удалено). b1 & a4 добавляются, поэтому после редактирования полей у меня есть инструкции как a1, a2, b1, b4 для D22_1.

Мое усилие: -

Что я пробовал.

1) Для основного устройства D22, если я указываю свойства явно, это нормально, например.

device.Name="aaaaa"; 

this.context.savechanges(); 

отражает его в базе данных. Я не пробовал это для обновления инструкций в списке.

2) Я пытался использовать

this.context.Entry(device).State = EntityState.Modified; 

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

Пожалуйста, предложите мне что-нибудь. Кроме того, я хочу знать о различных методах, связанных с обновлением записей со списком в EF. Я предполагаю, что EF автоматически позаботится о дочернем объекте (т. Е. Добавлении/обновлении и удалении). В моем случае Инструкции для устройства.

+0

[Это сообщение] (http://stackoverflow.com/questions/13236116/entity-framework-problems-updating-related-objects) показывает, как обновить коллекцию объекта. В основном, он перемещает элементы в коллекции и обрабатывает три ситуации, которые могут возникнуть - добавленный элемент, обновленный элемент, элемент удален. –

+1

newDevice = устройство; это проблема: newDevice в контексте, устройство - нет. поскольку вы устанавливаете ссылку на другое значение, EF больше не сможет ее отслеживать. вам придется устанавливать атрибуты один за другим или работать в отдельном сценарии. – DevilSuichiro

+0

@DevilSuichiro как я могу это сделать? работа в отключенном сценарии – iGod

ответ

0

Попробуйте это:

this.context.Attach(device); 
this.context.Entry(device).State = EntityState.Modified; 
this.context.SaveChangesAsync(); 
+0

Я получаю эту ошибку. Прикрепление объекта типа «Устройство» не удалось, поскольку другой объект того же типа уже имеет такое же значение первичного ключа. Это может произойти при использовании метода «Прикрепить» или установки состояния объекта в «Без изменений» или «Модифицировано», если любые объекты на графике имеют конфликтующие значения ключей. Это может быть связано с тем, что некоторые объекты являются новыми и еще не получили значения ключей базы данных. В этом случае используйте метод «Добавить» или «Добавленное» состояние объекта для отслеживания графика, а затем, если необходимо, установите состояние не новых объектов «Без изменений» или «Модифицировано». – iGod

+0

Я пробовал это: -this.context.Device.Attach (newDevice); новыйDevice = устройство; this.context.Entry (newDevice) .State = System.Data.Entity.EntityState.Modified; – iGod

0

Благодаря всем вам. для того, чтобы показать мне путь. Проблема решена. Обновление/удаление теперь работает нормально. Теперь я настрою свое решение для добавления. я взял помощи этого «How to add/update child entities when updating a parent entity in EF»

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