我正在使用 EF 和 MVVM 模式。我的问题是关于数据访问层的。在 DAL 我有以下课程:
MyObjectContext
这在技术上是现在的标准 ObjectContext,但稍后将添加一些工作单元方法。Repository<TModel>
它处理不同 ObjectSet 上最需要的查询(例如 Add、GetAll、...)。其中一些
DataServices
利用存储库为 Core 提供更高级别的数据访问。
我正在处理的项目是一个业务应用程序,到目前为止大约有 100 个 EntitySet,有时用户的单个交互可能涉及多达 20 个不同的 EntitySet(更新其中的大多数)。我目前添加.Include(params string[])
到我的查询中以防止ObjectContextDisposedException
但它似乎不是一个可靠的解决方案。
问题是我应该在每个 DataService 方法中创建一个实例MyObjectContext
(因此是存储库)(如以下代码,在我看来,在这种情况下工作单元的能力将毫无用处)还是应该在外部创建它DataService 并通过它们的构造函数(或直接传递给每个 DataService 方法)将其传递给 DataService,以一起处理一堆数据库操作(不同的表和查询)。如何?
如下MyObjectContext
所示:
public class MyObjectContext : ObjectContext, IUnitOfWork
{
public MyObjectContext()
: base("name=EdmContainer", "EdmContainer")
{
ContextOptions.LazyLoadingEnabled = true;
}
#region IUnitOfWork Members
public void Commit()
{
SaveChanges();
}
#endregion
}
这是Repository
这样的:
public class Repository<TModel>
{
private readonly SoheilEdmContext _context;
public Repository(IUnitOfWork unitOfWork)
{
if (unitOfWork == null)
throw new ArgumentNullException("unitOfWork");
_context = unitOfWork as SoheilEdmContext;
}
public TModel FirstOrDefault(Expression<Func<TModel, bool>> where)
{
return _context.CreateObjectSet<TModel>().FirstOrDefault(where);
}
public void Add(TModel entity)
{
_context.CreateObjectSet<TModel>().AddObject(entity);
}
...
}
这就是常见的DataService
样子:
public class JobDataService : IDataService<Job>
{
#region IDataService<Job> Members
public Job GetSingle(int id)
{
Job model = null;
using (var context = new MyObjectContext())
{
var repos = new Repository<Job>(context);
model = repos.FirstOrDefault(x => x.Id == id);
}
return model;
}
public IEnumerable<Job> GetAll()
{
using (var context = new MyObjectContext())
{
var repos = new Repository<Job>(context);
var models = repos.GetAll();
return models;
}
}
public IEnumerable<Job> GetActives()
{
throw new NotImplementedException();
}
public int AddModel(Job model)
{
using (var context = new MyObjectContext())
{
var repos = new Repository<Job>(context);
repos.Add(model);
context.SaveChanges();
}
}
public void UpdateModel(Job model)
{
throw new NotImplementedException();
}
public void DeleteModel(Job model)
{
using (var context = new MyObjectContext())
{
var repos = new Repository<Job>(context);
var model = repos.FirstOrDefault(x => x.Id == model.Id);
if (model == null) return;
repos.Delete(model);
context.SaveChanges();
}
}
#endregion
}
任何想法或见解都会受到赞赏。