从视图模型更新记录的正确方法是什么?

时间:2016-09-29 14:08:08

标签: c# mvvm uwp entity-framework-core

仍在使用我的第一个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();
        }
    }
}

我只是不喜欢这个解决方案! 我必须将item的所有属性复制到dbItem中。如果我忘了怎么办?我可以实现ICloneable但我觉得这对我所有的实体来说都是一个真正的开销。

那么这里的正确模式是什么?更新视图模型管理的记录的最佳方法是什么?

非常感谢, 于连

1 个答案:

答案 0 :(得分:0)

你必须在app上使用Repository模式。然后你可以完全将你的DAL层与ViewmModel解耦。在服务层你可以使用AutoMapper将ViewModel映射到Entity,反之亦然。此时你可以做到在你的服务层上。但你必须为Repository模式(即DAL)引入单独的层与依赖注入。然后你不必担心VM和实体的混合。换句话说,那些在2上如果您实现上述模式,则单独的图层

因此,您使用EF核心,可以使用Autofac作为DI API。

什么是AutoMapper?

  

AutoMapper是一个简单的小型库,用于欺骗性地解决问题   复杂的问题 - 摆脱映射一个对象的代码   另一个。这种类型的代码相当沉闷,写起来很无聊,所以   为什么不为我们发明一个工具?

以下是链接:AutoMapper

好文章:Generic Repository and Unit of Work Pattern, Entity Framework,Autofac

正如 @Sean Stayn 所示,你可以使用Prism。也可以看到。

  

Prism是一个构建松散耦合,可维护和   WPF,Windows 10 UWP和Xamarin Forms中可测试的XAML应用程序。