2016-09-29 3 views
6

Все еще работает над моим первым приложением 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

+0

Я почти не вижу «лучшего» способа, ведь это обновление.Вы можете ПРОВЕРИТЬ все свойства, чтобы не переписывать те, которые не менялись, но все же вам нужно будет работать над каждым свойством в какой-то момент. – Kilazur

+0

Вы можете использовать Automapper http://automapper.org/, чтобы избежать любых проблем с отображением – Rohit

+0

Automapper - последнее убежище негодяя. Не используйте его. И ваш реальный вопрос: «Как обновить отдельную модель в ядре EF?» Это не имеет никакого отношения к wpf и mvvm. – Will

ответ

0

Вы должны использовать Repository рисунок на вашем app.Then вы можете полностью отделить свой DAL слой из ViewmModels.On слой услуг, где вы можете использовать AutoMapper для отображения ViewModel в Entity и verse versa.В этом моменте вы можете сделать это на своем уровне сервиса. Но вам нужно ввести отдельный слой для шаблона репозитория (то есть DAL) с помощью инъекции зависимостей. Тогда вам не нужно беспокоиться о соединении виртуальных машин и Entities. Другими словами, они находятся на двух отдельных слоях, если вы реализуете вышеприведенный шаблон.

Следовательно, вы используете ядро ​​EF, вы можете использовать Autofac в качестве DI API.

Что такое AutoMapper?

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

Вот ссылка: AutoMapper

Хорошая статья: Generic Repository and Unit of Work Pattern, Entity Framework,Autofac

Как было предложено @Sean Stayn, где вы можете использовать Prism .Увидь, что тоже.

Prism является основой для построения слабо связанных, ремонтопригодны и тестируемых приложений XAML в WPF, Windows 10 UWP и Xamarin формы.

+0

Если вы используете AutoFac и Injection Dependency Injection, я рекомендую Prism 6 для UWP. Очень полезно начать с DI и UWP! –

+0

Я не согласен с вами. Где-то из OP 'Мне нужно скопировать все свойства элемента в dbItem. Что, если я забуду один? '. Затем' Automapper' будет делать то, что ему нужно. B'cos, если вы правильно настроили 'Automapper', тогда он никогда не забудет какое-либо свойство для отображения: D @Will – Sampath

+0

Aaah, я вижу откуда вы пришли. Тем не менее, все, что ему нужно сделать, - это снова подключить модель и пометить ее как измененную. Это намного проще сделать, чем импортировать новую зависимость. Да, это одно решение. – Will

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