这是我到目前为止的设置:
- 数据库优先实体框架(生成 EDMX)
- 将 POCO 分离到不同的项目中
- 在 EDMX 下留下自定义 DbContext以用作有界 Countext
- 创建了一个 UOW
- 创建了一个通用存储库(IRepository)
- 通过 IRepository 的具体实现将每个实体映射到 UOW
- UOW 实例化由 EDMX 创建的自定义 DbContext并将其传递给每个存储库
到目前为止一切都很好。
现在,问题出在最后一部分。UOW 实例化Custom DbContext,将其注入到存储库中,一切正常……在大多数情况下。
每个 Repository 实现都采用 DbContext,创建一个 DbSet 并公开通常的 CRUD 操作。所有实体都可以通过泛型访问,所以如果我想实现说GetAll()我将简单地返回 DbSet 并且它已经被映射到 Entity 。
但是,当我尝试从存储库中的 DbContext 访问函数导入时......我不能。
我当然不能这样做是有道理的:通用存储库将 DbContext 作为输入,但它对 EDMX 创建的自定义 DbContext 一无所知,因此,添加到自定义 DbContext中的所有此类函数都不知道其中的 DbContext存储库。
换句话说:
- 我可以在 UOW中访问自定义 DbContext中的函数导入
- 我将自定义 DbContext传递给每个实体存储库的构造函数
- 存储库需要派生自 DbContext 的任何类,因此自定义 DbContext可以解决问题
- 当存储库尝试通过 DbContext 访问函数导入时,它可以访问,因为它不知道它们
显然我不能在任何地方都使用Custom DbContext,因为我会将 Repository 与特定的 Custom DbContext 结合起来,而且我需要不止一个,因为我创建了几个有界上下文。
唉,问题:如何在不将其与特定的自定义 DbContext 结合的情况下从存储库中调用函数导入?
解决方法:
我知道我可以使用反射,但出于性能原因,我试图摆脱它(我知道这并不可怕,但仍然......目前的问题是寻找更好的方法)。
我已经设法使用 DbContext.SqlQuery() 来执行存储过程(映射到 EDMX 中的函数导入)。再一次,因为我可以轻松地在 EDMX 中交换函数导入,所以我想找到一种在存储库中访问它的方法。
希望这一切都有意义。我很感激任何人都可以解决这个问题。