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