实体框架 - WPF / MVVM应用程序中的基础结构

时间:2016-03-15 09:31:22

标签: c# wpf entity-framework mvvm

我是第一次在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存在......

1 个答案:

答案 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中分离出来 希望它有所帮助