Asp.net mvc ASP.NET MVC-DbContext良好实践
我正在用Entity Framework启动一个新的.NET MVC项目,我正在努力解决一些问题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
DbContext
。如果您有很多实体,您只需要确保您需要的所有实体都存在于该上下文中。例如,如果从数据库及其相关的地址
检索人员
,则人员
和地址
必须存在于同一DbContext
中
我没有尝试使用多个DbContext
实例,但需要注意的一点是,如果在多个上下文中包含同一个表,那么最终可能会得到名称相似或冲突的类。例如,如果在两个上下文中包含Person
,则每个上下文将尝试创建名为Person
的类
DbContext
时,它将仅为从数据库检索的数据创建对象。因此,如果您从Person
表中请求一行,那么只会创建一个Person
对象。如果请求100行,则将创建100个实例
DbContext
,并在整个类中重用它
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应用程序的关键部分
是的,依赖注入是一个很好的实践。