1

这是我到目前为止的设置:

  • 数据库优先实体框架(生成 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 中交换函数导入,所以我想找到一种在存储库中访问它的方法。

希望这一切都有意义。我很感激任何人都可以解决这个问题。

4

1 回答 1

0

我不清楚你怎么知道要调用什么函数或它需要什么参数。但是,您可以查看为函数导入生成的代码,它基本上如下所示:

((IObjectContextAdapter)this).ObjectContext
     .ExecuteFunction<Customer>("Customers_With_Recent_Orders", customerId)

因此(而不是使用反射)你可以动态地做同样的事情——假设即使使用反射你也必须知道要调用什么函数,你应该知道你期望的实体的类型,你可以params用来传递任意数量的参数应该是可行的。

** 编辑 **

您还可以使用其他重载将该函数作为无跟踪执行:

((IObjectContextAdapter)this).ObjectContext
     .ExecuteFunction<Customer>(
         "Customers_With_Recent_Orders", 
         MergeOption.NoTracking, 
         customerId)
于 2013-08-15T05:55:41.787 回答