Все еще работает над моим первым приложением UWP/MVVM/EF Core.Каков правильный способ обновления записи из модели просмотра?
Я не хочу, чтобы мои viewmodels имели какие-либо знания DbContext. Поэтому я создал следующий класс ItemService, введенный в мои модели просмотра.
public class ItemService : IItemService
{
public async Task SaveAsync(Item item)
{
using (var db = new MyDbContext())
{
db.Items.Add(item);
await db.SaveChangesAsync();
}
}
}
Мой ItemViewModel содержит следующую команду:
public RelayCommand SaveCommand { get; private set; }
private async void Save()
{
if (!SaveCommand.CanExecute(Item))
return;
await ItemService.SavAsync(Item);
}
Это прекрасно работает, когда я сохранить элемент. Метод SaveAsync создает новый экземпляр DbContext, добавляет только что созданный элемент и затем фиксирует изменения в базе данных.
Мой вопрос об обновлении существующей записи. Что-то вроде этого:
public class ItemService : IItemService
{
public async Task UpdateAsync(Item item)
{
using (var db = new MyDbContext())
{
Item dbItem = (from i in db.Items
where i.Id = item.Id
select i).FirstOrDefault();
// Here I should duplicate all the item's properties into dbItem ones
await db.SaveChangesAsync();
}
}
}
Мне просто не нравится это решение! Мне нужно скопировать все свойства элемента в dbItem. Что, если я его забуду? Я мог бы реализовать ICloneable, но я нахожу это реальными накладными расходами для этого для ВСЕХ моих сущностей.
Итак, каков правильный шаблон здесь. Лучший способ обновить запись, управляемую моделью просмотра?
Большое спасибо заранее, Julien
Я почти не вижу «лучшего» способа, ведь это обновление.Вы можете ПРОВЕРИТЬ все свойства, чтобы не переписывать те, которые не менялись, но все же вам нужно будет работать над каждым свойством в какой-то момент. – Kilazur
Вы можете использовать Automapper http://automapper.org/, чтобы избежать любых проблем с отображением – Rohit
Automapper - последнее убежище негодяя. Не используйте его. И ваш реальный вопрос: «Как обновить отдельную модель в ядре EF?» Это не имеет никакого отношения к wpf и mvvm. – Will