【问题标题】:Using ApplicationDbContext in Repository Pattern在存储库模式中使用 ApplicationDbContext
【发布时间】:2021-02-20 05:33:29
【问题描述】:

我想在我的 ASP.NET MVC 项目中实现存储库模式。我在搜索谷歌时看到了很多实现,我有点困惑。他们中的大多数创建了自己的 Context 类,该类继承自 DBContext 类,然后将其注入存储库(或存储库)构造函数中。 我发现的所有文章都没有解释为什么要创建自定义 DBContext 类以及为什么它们不使用默认 ApplicationDbContext 以及如何更改您的应用程序代码以适应新的 Context 类。他们甚至没有提到课程。

我宁愿使用我会在存储库类中注入的默认 ApplicationDbContext,因为目前我没有看到创建新 DBContext 类的意义。我错过了什么吗?这是一种不好的做法吗?

如果由于某种原因我必须添加新的 DbContext 类,如何编辑我的代码(web.config 和其他)以适应它?如果我已经迁移到数据库,DBContext 类的更改会影响数据库吗?是否需要再次进行迁移?

举个例子,看看 MSDN 文档: https://docs.microsoft.com/en-us/aspnet/mvc/overview/older-versions/getting-started-with-ef-5-using-mvc-4/implementing-the-repository-and-unit-of-work-patterns-in-an-asp-net-mvc-application 我只是不知道为什么作者使用 SchoolContext 而不是 ApplicationDbContext。

【问题讨论】:

    标签: c# asp.net asp.net-mvc repository-pattern


    【解决方案1】:

    这是一个广泛的问题,猜测这就是投反对票的原因。

    你看起来确实很困惑。首先,我不是专家(见点)。 default ApplicationDbContext 确实让我有点困惑。也许您在弹出的地方使用模板?无论如何,我启动了 MVC 模板并且没有提供默认的上下文类。

    简而言之,您可以创建自己的上下文类。你可以给它任何你想要的名字,因为它以 Context 结尾并且它从 DbContext 继承。如果不是,Entity 框架将无法识别它,并且在构建数据库等时将不知道如何处理它。请参阅您的文章:

    为给定数据模型协调实体框架功能的主要类是数据库上下文类。您可以通过派生自 System.Data.Entity.DbContext 类来创建此类。在您的代码中,您指定哪些实体包含在数据模型中。您还可以自定义某些实体框架行为。在这个项目中,这个类被命名为 SchoolContext。 块引用

    默认情况下,您只有一个 Context-class。

    不言而喻,您需要创建自己的上下文类,因为您无法访问 DbContext 类。 (即使可以,您也不应该这样做,您需要将抽象和实现分开。)

    我不明白§2。 ApplicationDbContext 只是编写 MySelfNamedContextClass 的一种方式。

    §3:我不知道使用两个 contect-classes 是否可能/可行,但简单的含义是您将使用两个单独的数据库。这已经很复杂了,而且你写的不是那个方向。

    如果我已经迁移到数据库,会更改 DBContext 类影响数据库?是否有必要进行一次迁移 再来一次?

    是的,绝对会的。您添加一个表或一个字段或一个约束或与它的关系......。 根据您带来的变化,您可以做两件事: (i) 添加补充迁移 (ii) 您将不得不倒带您的迁移(remove-migration)。可能是您需要将您的数据库重置为您的第一次迁移(update-database '这里是第一次迁移的名称,不带引号'。如果您遇到这种情况,并且您仍在本地数据库上,只需删除 db by彻底删除它(可能在关闭解决方案之后)并倒带并重建迁移并重建数据库。 特别是对于场景(ii),如果您已经在数据库中拥有数据(未植入其中),则需要采取措施将其存储在某个地方!!!

    我希望这能以某种方式回答您的问题。

    亲切的问候。

    【讨论】:

    • 感谢您的全面回答。当我询问某事时,我总是希望尽可能准确。我认为这个问题不准确,因为我很困惑。无论如何,我谈论的“默认” ApplicationDbUser 类似乎是在您创建项目并在选择身份验证选项时选择“个人用户帐户”时自动创建的。我不知道没有它就不会创建它。也许这就是 ASP.NET 使开发人员更容易开始使用数据库的方式(它还创建用户模型等)。
    • 这有助于开发人员不必浪费时间从头开始编写自己的 DBContext 类。现在我将其理解为开发人员可能会或可能不会使用的设施。您可以使用它或编写自己的类。
    • 附言。 ApplicationDbContext 类位于 IndentityModels.cs 中。不知道他们为什么将两个类合并到一个文件中,但这是您应该知道的。
    • 你在 VS2019 中使用的是什么模型?如果您解释您正在使用的模板,我们可以更好地模拟和理解问题...... .
    • ASP.NET Web 应用程序、模板 - MVC、身份验证 - 个人用户帐户
    猜你喜欢
    • 2014-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多