我们目前使用实体框架来访问我们的数据库。我们有一个大类,有数千行长,充满了查询数据库的方法。
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 不应该以我现在使用它的方式使用。
郎朗坤
相关分类