我们目前使用实体框架来访问我们的数据库。我们有一个大类,有数千行长,充满了查询数据库的方法。 void saveFirstThing() { using (var dbContext = new DatabaseContext()) { ... } } AnotherThing returnAnotherThing() { using (var dbContext = new DatabaseContext()) { ... } } ...但是,如果我们想更改数据库提供程序(或使用假值测试我们的应用程序),那么这样做会非常烦人。所以我创建了:接口,它提供带有- , , , ...IRepository<T>的操作TGet(int id)Add(T entity)GetAll()接口的实现,通过调用 EF 并返回 IQueryable 来实现方法。 public class AnotherThingRepository : IRepository<AnotherThing> { ... public IQueryable GetAll() { ... } ... } public class Something { AnotherThing returnAnotherThing() { return anotherThingRepository.GetAll().Where(...).Single(); } }但是,我有一个问题。我们有需要连接多个表的方法。所以我不能使用using(dbContext)的内部实现,因为它会在我们完成查询结果(类型为 )之前IRepository删除。我无法返回or ,因为它不会加载所有连接的字段(并且可能有很多)。如果我想做一些混乱的反射,它会很慢并且充满了我需要解决的循环引用。dbContextIQueryableIEnumerableList最好的解决方案是什么?现在唯一有效的方法是dbContext永远保留,并为给定存储库实现中的所有查询共享它。然而,当我需要从数据库更新某些内容时,它会停止工作,因为dbContext缓存所有内容,并且 dbContext 不应该以我现在使用它的方式使用。
1 回答
郎朗坤
TA贡献1921条经验 获得超9个赞
现在唯一有效的方法是永远保留 dbContext,并为给定存储库实现中的所有查询共享它。
不可以。DbContext 的范围应限于工作单元,这可能涉及多个存储库实例。
一个简单的实现是将 DbContext 注入每个存储库类型的构造函数中。例如
using (var db = new MyDatabase())
{
var things = new ThingRepository(db);
var anotherThings = new AnotherThingRepository(db);
. . .
db.SaveChanges();
}
- 1 回答
- 0 关注
- 78 浏览
添加回答
举报
0/150
提交
取消