为了账号安全,请及时绑定邮箱和手机立即绑定

允许数据库查询但独立于所使用的数据库提供程序的设计模型

允许数据库查询但独立于所使用的数据库提供程序的设计模型

C#
富国沪深 2023-09-09 15:39:21
我们目前使用实体框架来访问我们的数据库。我们有一个大类,有数千行长,充满了查询数据库的方法。    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();

}


查看完整回答
反对 回复 2023-09-09
  • 1 回答
  • 0 关注
  • 78 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信