猿问

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

我们目前使用实体框架来访问我们的数据库。我们有一个大类,有数千行长,充满了查询数据库的方法。


    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 不应该以我现在使用它的方式使用。


富国沪深
浏览 79回答 1
1回答

郎朗坤

现在唯一有效的方法是永远保留 dbContext,并为给定存储库实现中的所有查询共享它。不可以。DbContext 的范围应限于工作单元,这可能涉及多个存储库实例。一个简单的实现是将 DbContext 注入每个存储库类型的构造函数中。例如using (var db = new MyDatabase()){&nbsp; &nbsp;var things = new ThingRepository(db);&nbsp; &nbsp;var anotherThings = new AnotherThingRepository(db);&nbsp; &nbsp;. . .&nbsp; &nbsp;db.SaveChanges();}
随时随地看视频慕课网APP
我要回答