Не удалось отредактировать объект сущности asp.net - PullRequest
0 голосов
/ 05 марта 2019

У меня есть функция, которая принимает ViewModel, как это.

 public ActionResult(ViewModel viewModel)
 {
       var entityObject = _context.User.Find(viewModel.User.Id);
       entityObject = viewModel.User;
       _context.SaveChanges();
 }

Я вижу, что entityObject изменяется (при отладке), но информация не сохраняется в базе данных. Нужно ли вручную добавлять все атрибуты следующим образом:

 entityObject.Name = viewModel.User.Name;
 entityObject.Age = viewModel.User.Age;

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

Все предложения приветствуются.

Контекст базы данных внедряется в конструктор контроллера (если это имеет значение)

Ответы [ 2 ]

2 голосов
/ 05 марта 2019

Да. Вы должны отобразить значения; вы не можете просто вставить другой экземпляр в одну и ту же переменную. Экземпляр в вашей модели представления не отслеживается, поэтому EF даже не подозревает, что с ним что-то нужно делать. Единственное, что он отслеживает, - это экземпляр User, изначально сохраненный в entityObject, который вы фактически уничтожаете, заменяя значение переменной экземпляром из вашей модели представления.

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

Независимо от как вы делаете отображение, вы, безусловно, должны это делать. Здесь нет бесплатного обеда.

0 голосов
/ 05 марта 2019

Вы можете обновить значения, не перечисляя все свойства, как это:

var entity = _collection.Find(item.Id);
if (entity == null)
{
    return;
}

_context.Entry(entity).CurrentValues.SetValues(item);

Метод обновления Entity Framework работает так же.

Также существуют другие опции, такие как AutoMapper или Mapster.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...