我第一次在MVF模式的WPF应用程序中使用EF。我读了很多东西,但最终无法找到解决方案。我的问题是如何在我的应用程序中集成EF。
我发现的最常见方法是构建自己的存储库+ UnitOfWork。我不喜欢基本上因为我已经拥有可以作为工作单元和存储库工作的DbContext和DbSet,所以为什么要重新发明轮子呢?
所以我试图直接从这样的 View 模型中使用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>();
}
但是我不喜欢直接在 View 模型中使用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>();
}
但是通过这种方式,每个 Action 都是原子的,因此,当我修改实体时,每次都必须调用SaveChanges()或进行零散的更改,因为DbContext总是被丢弃。那么为什么不创建一个类范围的DbContext呢?
public class DbServices
{
private Lazy<> mContext;
public DbServices()
{
mContext = new Lazy<TContext>(() => {return new DbContext();});
}
public TContext Context { get { return context.Value; } }
public TReturn Execute<TEntity>(Func<IDbSet<TEntity>, TReturn> func)
{
return func(Context.DbSet<TEntity>());
}
}
不幸的是,这种方式再次不起作用,因为一旦创建了dbcontext,它就永远不会被丢弃...那么显式打开/关闭DbContext呢?
问题是:我应该在哪里以及如何创建/配置DbContext?我唯一能确定的是,我不想重建存储库和工作单元,因为它们已经以DbContext和DbSet的形式存在。
最佳答案
我在同一位置。我发现客户端上的任何持久性存储库都会导致用户看不到彼此的更改。
这是一个很好的视频,解释了为什么EF与存储库不一样
https://www.youtube.com/watch?v=rtXpYpZdOzM
我也找到了关于WPF,MVVM和EF的出色的端到端教程
http://www.software-architects.com/devblog/2010/09/10/MVVM-Tutorial-from-Start-to-Finish。
在这种情况下,他通过WCF数据服务公开了数据,并立即将它们与dbcontext分离。
希望能帮助到你
关于c# - Entity Framework -WPF/MVVM应用程序中的基础结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36007302/