我是第一次在WPF应用程序中使用EF,使用MVVM模式。我读了很多东西,但我无法找到解决方案。我的问题是如何将EF集成到我的应用程序中。
我发现最常见的方法是构建自己的Repository + UnitOfWork。我不喜欢它。基本上因为我已经有DbContext和DbSet可以作为工作单元和存储库工作,所以为什么要重新发明轮子?
所以我尝试直接从像这样的视图模型中使用DbContext
$sql="SELECT p.id,p.post_convert,p.post_id,p.post_title,p.post_by, p.post_time,p.post_view,p.post_catelogy,
p.post_content,p.post_summary,p.post_picture, c.menu_id,c.menu_title,u.id_user,u.username,u.info
FROM post p, category c, user u
WHERE p.post_by = '{$_SESSION['user_id']} ' && p.post_catelogy = c.menu_id
ORDER BY p.id DESC";
但我不想直接从视图模型中使用DbContext,所以我构建了一个服务层
public class BookCollectionViewModel : ViewModelBase
{
public void LoadCollection()
{
Books.clear();
var books = new List<Book>();
using(var ctx = new DbContext())
{
books = ctx.DbSet<Book>().ToList();
}
books.Foreach(b => Books.Add(b));
}
ObservableCollection<Book> Books { get; } = new ObservableCollection<Book>();
}
但是这样每个动作都是原子的,所以当我修改一个实体时,我每次都要调用SaveChanges()或松散更改,因为DbContext总是被处理掉。那么为什么不创建一个类范围的DbContext?
public class DbServices
{
public TReturn Execute<TEntity>(Func<IDbSet<TEntity>, TReturn> func)
{
TReturn retVal = default(TReturn);
using(var ctx = new DbContext())
{
retVal = func(ctx.DbSet<TEntity>());
}
return retVal;
}
}
public class BookCollectionViewModel : ViewModelBase
{
private DbServices mDbServices = new DbServices();
public void LoadCollection()
{
Books.clear();
var books = mDbServices.Execute<Book>((dbSet) => return dbSet.ToList());
books.Foreach(b => Books.Add(b))
}
ObservableCollection<Book> Books { get; } = new ObservableCollection<Book>();
}
不幸的是,这种方式再次起作用,因为一旦创建了dbcontext,它就永远不会被释放......那么如何显式打开/关闭DbContext?
问题是:我应该在何处以及如何创建/处置DbContext?我唯一确定的是,我不想重建存储库和工作单元,因为它们已经作为DbContext和DbSet存在......
答案 0 :(得分:0)
我处于相同的位置。我发现客户端的任何持久存储库都会导致用户不能看到彼此的变化。
这是一个很好的视频,解释为什么EF与存储库不同
https://www.youtube.com/watch?v=rtXpYpZdOzM
我还发现了一个关于WPF,MVVM和Linux的优秀端到端教程。 EF
http://www.software-architects.com/devblog/2010/09/10/MVVM-Tutorial-from-Start-to-Finish。
在此,他通过WCF数据服务公开数据,并立即将它们从dbcontext中分离出来
希望它有所帮助