【发布时间】:2017-02-07 22:01:02
【问题描述】:
仍在开发我的第一个 UWP/MVVM/EF Core 应用程序。
我不希望我的视图模型对 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,但我发现为我的所有实体执行此操作确实需要开销。
那么这里的正确模式是什么。更新由视图模型管理的记录的最佳方式?
提前非常感谢, 朱利安
【问题讨论】:
-
我几乎看不到“更好”的方法,毕竟这就是更新。您可以检查每个属性以避免重写那些没有更改的属性,但是,您仍然必须在某个时候处理每个属性。
-
您可以使用 Automapper automapper.org 来避免任何映射问题
-
Automapper 是无赖的最后避难所。不要使用它。您真正的问题是“如何更新 EF 核心中的分离模型?”它实际上与 wpf 和 mvvm 没有任何关系。
-
(请注意,Automapper 适合将字段从一个对象实例复制到另一个,但将实例重新连接到上下文是更好的选择。我会回答,但我不知道 EF Core 是否在这方面与我知道的 EF 6 不同)
标签: c# mvvm uwp entity-framework-core