在控制器中使DbContext类无法访问的最佳方法是什么?

时间:2015-12-08 12:35:56

标签: asp.net-mvc entity-framework model-view-controller controller dbcontext

我正在使用ASP.NET构建一个Web应用程序,我在一个解决方案中创建了两个独立的项目,其中一个是ASP.NET项目,另一个是“控制台应用程序”。称为数据层。在数据层中,我已经将它与我的本地数据库(首先是ADO.NET实体框架数据库)连接起来。

我的问题是,我希望我的DbContext类在我的ASP.NET项目中的控制器中不可访问。目前,只需使用数据层即可访问它。我的ASP.NET中有一个带有构建器类的文件夹,它们可以访问DbContext,我只希望构建器到达我的DbContext。因此,在我的控制器中,我只想使用构建器对DbContext执行某些操作。

我想要的示例:

    public ActionResult Index() 
    {
         return View(new ExampleBuilder().GetListFromDb());
    }

而不是(这在我的项目中必须被禁止和无法访问):

private DbContext db = new DbContext();

public ActionResult Index() 
{
   return View(db.SomeModel.ToList());
}

有没有人有这方面的好解决方案?

1 个答案:

答案 0 :(得分:3)

您可以使用以下项目结构

  • Web(取决于Data.Repositories和Common)
  • Data.Repositories(取决于Data.Model和Common) - 在这里实现使用Data.Model中的EntityFramework上下文的存储库。
  • Data.Model(取决于Common) - 将您的EntityFramework上下文类放在此处,但所有模型都应该进入Common以使它们可用于所有项目。
  • Common - 您的EntityFramework模型以及其他需要随处访问的内容,例如:例外,工具。

基本上,您的存储库方法看起来像这样:

public Common.User GetUserByEmail(string email)
{
    using (var context = new Data.Model.MyContext())
    {
        return context.Users.FirstOrDefault(user => user.Email == email);
    }
}

您的网站没有对Data.Model的引用,它将无法直接使用您的上下文类。它必须通过Repositories抽象层。