Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc ASP.NET MVC-DbContext良好实践_Asp.net Mvc_Entity Framework - Fatal编程技术网

Asp.net mvc ASP.NET MVC-DbContext良好实践

Asp.net mvc ASP.NET MVC-DbContext良好实践,asp.net-mvc,entity-framework,Asp.net Mvc,Entity Framework,我正在用Entity Framework启动一个新的.NET MVC项目,我正在努力解决一些问题 在我的模型中,我有大约150个实体(从数据库生成)。只有一个DbContext是个好主意吗?如果没有,我应该如何划分我的实体 如果我有一个DbContext,并且我创建了一个实例化数据库上下文对象的类变量(在控制器中),那么这个DbContext会发生什么?它是否为我的每个实体在内存中创建了单独的空间?在我的情况下,当我有150个实体时,它不会非常有效。我错了吗 我将在许多控制器中使用DbConte

我正在用Entity Framework启动一个新的.NET MVC项目,我正在努力解决一些问题

  • 在我的模型中,我有大约150个实体(从数据库生成)。只有一个DbContext是个好主意吗?如果没有,我应该如何划分我的实体

  • 如果我有一个DbContext,并且我创建了一个实例化数据库上下文对象的类变量(在控制器中),那么这个DbContext会发生什么?它是否为我的每个实体在内存中创建了单独的空间?在我的情况下,当我有150个实体时,它不会非常有效。我错了吗

  • 我将在许多控制器中使用DbContext。创建一个MainController(在这里我创建了新的DbContext)是不是一个好主意,它将被其余的控制器继承?因为这允许其他人访问相同的上下文

  • 处理DbContext的最佳实践是什么?我已经读到使用依赖注入是一个很好的实践。但通过这种方式,我必须将上下文注入到我的每个控制器中。哪种依赖注入方式现在最流行和使用

  • 我真的需要你的建议。这将使我对这一发展有更多的了解

  • 可以使用一个
    DbContext
    。如果您有很多实体,您只需要确保您需要的所有实体都存在于该上下文中。例如,如果从数据库及其相关的
    地址
    检索
    人员
    ,则
    人员
    地址
    必须存在于同一
    DbContext

    我没有尝试使用多个
    DbContext
    实例,但需要注意的一点是,如果在多个上下文中包含同一个表,那么最终可能会得到名称相似或冲突的类。例如,如果在两个上下文中包含
    Person
    ,则每个上下文将尝试创建名为
    Person
    的类

  • 创建
    DbContext
    时,它将仅为从数据库检索的数据创建对象。因此,如果您从
    Person
    表中请求一行,那么只会创建一个
    Person
    对象。如果请求100行,则将创建100个实例

  • 实际上有两种选择。第一,在每个动作中创建一个新实例,完成工作,然后保存它。或者,在构造函数中创建一个
    DbContext
    ,并在整个类中重用它

  • 这取决于你在第3点中的选择。如果将其传递到构造函数中,则实现
    IDisposable
    ,并在其中释放它。如果在每个操作中创建一个新操作,请确保使用
    using
    语句将其释放


  • 对于依赖项注入,有许多选项、教程等,介绍如何在ASP.NET MVC中实现这一点。我个人使用Autofac和相关的MVC扩展,并将
    DbContext
    的新实例传递给每个控制器。

    关于DbContext问题: 我将使用多个dbcontext(有界上下文)

    单个big dbcontext的一个问题是加载和初始化时间,因为它将映射所有实体,并且这会随着上下文中实体数量的增加而增加

    现在,您的项目必须由模块组成,在这里,您可以将大数据库上下文划分为小数据库上下文,这些小数据库上下文涵盖了每个模块使用数据库所需的所有内容,例如,假设您的项目有两个模块(成员资格和账单或财务),用于客户/个人实体,您会发现,当您与会员模块中的人员打交道时,您需要其所有详细信息,但不需要其发票的全部详细信息;当您与计费模块中的人员打交道时,您需要其所有发票,但不需要其全部个人信息,在这里,您可以为每个模块创建2个dbcontexts,其中person实体包含该模块从person实体中需要的内容

    Julie lerman有一篇关于dbcontext with Entity framework的好文章,这篇文章的开头是关于我在这里试图描述的内容的更多细节,


    希望这有帮助。

    150个实体不是一个庞大的DbContext,但它的大小超过了EF在初始化第一个DbContext时开始出现性能问题的大小。如果您可以逻辑地将实体划分为责任区域(称为有界上下文),那么您可能会考虑使用多个DbCurror。此外,您的应用程序是否需要使用所有这些实体?如果没有,你可以简化事情。另外请注意,您至少需要EF6才能有效地执行此操作,Entity Framework的早期版本在多个上下文中都存在问题

    在使用多个上下文时,还必须小心。许多人陷入困境,因为他们从一个上下文中获取了一个实体,但在另一个上下文中调用了save changes,然后不理解为什么他们的更改没有保存。或者,他们尝试将从一个实体检索到的实体添加到另一个实体,而这是您无法做到的。多个上下文会使事情变得更复杂,所以在分割它之前,请确保你想承担起这种复杂性

    只要处理得当,就不要担心DbContext使用的内存量。除非您实际从所有这些表加载对象,否则内存量将是最小的

    我认为一个共同的基础控制器是一个代码气味。它通常是完全不必要的,并且通常会成为您认为想要共享的每一段代码的垃圾场,这违反了单一责任原则。最重要的是,无论如何,您不应该在控制器中进行数据访问。您应该有一个某种服务层或业务层来调用数据访问层。正确地分离您的关注点是设计一个好的MVC应用程序的关键部分

    是的,依赖注入是一个很好的实践。