【问题标题】:What is the best way to make my DbContext class inaccessible in the controllers?使控制器中无法访问我的 DbContext 类的最佳方法是什么?
【发布时间】:2016-03-13 09:14:06
【问题描述】:

我正在使用 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());
}

有人对此有好的解决方案吗?

【问题讨论】:

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


    【解决方案1】:

    您可以使用以下项目结构

    • 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 抽象层。

    【讨论】:

    • 所以我的网站是一个 ASP.NET 项目,Data.Repositories 和其他两个只是控制台应用程序?
    • @elcommandante 不要使用Console Application 类型。相反,有一个Class Library 项目。差不多,但是当你使用console app类型的时候就意味着有一个启动入口点Program.Main(),相信你不需要它。
    • 谢谢!我目前正在研究我的解决方案结构,以使这一切成为可能。一旦这对我有用,我会立即发表评论。
    • 我已经添加了类库,我的结构如下: Web - 包含构建器和控制器 Commons - 包含将数据传递给 Context 类的真实对象的模型 Data.Model - 包含 Db。 edmx 和我的 DbContext 和 DbContextPartial(这包含来自 Data.Repositories 的 GenericRepository 类) Data.Repositories - 包含 IGenericRepository 和 GenericRepository。我在 Data.Repository 中有一个 Data.Model 引用。但是现在 DbContextPartial 不能引用 GenericRepository。而且我的网站也不能引用 Data.Model db 对象。解决方案?
    • @elcommandante 如果您从头开始编写应用程序,则不应使用 edmx 上下文。这是一种古老的方法。您需要使用最新的实体框架版本和最有可能的Code First 方法。它在构建整体架构方面更加灵活。
    猜你喜欢
    • 2020-04-10
    • 1970-01-01
    • 2016-01-23
    • 1970-01-01
    • 2010-11-20
    • 2012-09-10
    • 1970-01-01
    • 1970-01-01
    • 2013-03-13
    相关资源
    最近更新 更多