实体框架 - 我应该如何实例化我的“实体”对象

2024-02-18

我是实体框架和 ASP.Net MVC 的新手,主要从教程中学习,但对两者都没有深入的了解。 (我确实有 .Net 2.0、ADO.Net 和 WebForms 的经验)

我当前的怀疑来自于我实例化实体对象的方式。

基本上我在我的控制器中这样做:

public class PostsController : Controller {

    private NorthWindEntities db = new NorthWindEntities();

    public ActionResult Index() {
            // Use the db object here, never explicitly Close/Dispose it
    }
}

我这样做是因为我在一些 MSDN 博客中发现了它,该博客对我来说似乎足够权威,因此我认为这是正确的方法。
不过,我对此感到非常不安。虽然它节省了我很多代码,但我习惯这样做:

using (NorthWindEntities db = new NorthWindEntities() {
}

在每个需要连接的方法中,如果该方法调用需要连接的其他方法,它会将 db 作为参数传递给它们。这就是在 Linq-to-SQL 存在之前我对连接对象执行所有操作的方式。

另一件让我不安的事情是 NorthWindEntities 实现了 IDisposable,按照惯例这意味着我应该调用它的 Dispose() 方法,但我没有。

你怎么看待这件事?
像我一样实例化实体对象是否正确?它是否应该通过为每个查询打开和关闭连接来处理连接?
或者我应该使用 using() 子句显式处理它?

Thanks!


控制器本身实现了IDisposable。因此,您可以覆盖 Dispose 并处置在实例化控制器时初始化的任何内容(例如对象上下文)。

控制器的生命周期只有一个请求。因此,在动作内部使用 using 和整个控制器拥有一个对象上下文的上下文数量完全相同:1。

这两种方法之间的最大区别在于,操作将在视图渲染之前完成。因此,如果您在操作内的 using 语句中创建 ObjectContext,则 ObjectContext 将在视图呈现之前被释放。因此,您最好在操作完成之前阅读上下文中所需的任何内容。如果传递给视图的模型是一些惰性列表(例如 IQueryable),则您将在呈现视图之前释放上下文,从而在视图尝试枚举 IQueryable 时导致异常。

相比之下,如果您在初始化 Controller 时初始化 ObjectContext(或编写延迟初始化代码,使其在操作运行时初始化)并在 Controller.Dispose 中处置 ObjectContext,则当控制器初始化时,上下文仍然存在。视图已渲染。在这种情况下,将 IQueryable 传递给视图是安全的。视图渲染后不久控制器就会被释放。

最后,如果我没有指出让控制器了解实体框架可能是一个坏主意,那就是我的失职。考虑为您的模型和存储库模式使用单独的程序集,以使控制器与模型对话。谷歌搜索会出现很多关于此的内容。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

实体框架 - 我应该如何实例化我的“实体”对象 的相关文章

随机推荐

  • 部署后 JPA 实体中出现 ClassCastException (Glassfish 3.1.2)

    使用 Glassfish 3 1 2 取消部署和部署 WebArchive war 时出现奇怪的效果 asadmin undeploy myWebApp asadmin deploy target myWebApp war 它部署正常 但是
  • 在 Nginx 中从 Angular 调用 API 无法解析 Docker 服务名称

    我有一个Angular应用程序运行在NginX Docker容器 The Angular应用程序可以制作一个REST调用另一个容器 Spring Boot API Docker using localhost作为服务器 server str
  • SparklyR:直接转换为镶木地板

    您好 我是集群计算的新手 目前我只在独立集群上玩 sc lt spark connect master local version 2 0 2 我有一个巨大的 csv 文件 15GB 我想将其转换为 parquet 文件 第三块代码解释了原
  • 如何为 COM Interop 库生成 C# 源代码而不是程序集?

    导入 COM 库 直接使用 tlbimp 或间接使用 Visual Studio 添加引用对话框 时 有没有办法生成 C 源代码而不是二进制互操作程序集 例如 Interop Word dll UPD 反射器是个坏主意 问题是对于com接口
  • 高清处理器显卡 (HD4000) 无法作为英特尔 OpenCL SDK 中的设备加载

    我使用 i7 3770K Ivy Bridge 和 HD 4000 并且我已经安装了最新的驱动程序和最新的OpenCL SDK http software intel com en us articles vcsource tools op
  • 如何以统一的方式从.NET打印Office文档?

    使用 Microsoft interOp 对象 我可以通过编程方式打印 Word 或 Excel 文档 有没有更简单 统一的方法来以编程方式打印所有类型的文档 txt doc xls pdf 等 Microsoft 默认使用 DDE 从办公
  • 如何使用反射获取构造函数作为 MethodInfo

    构造函数如下所示 public NameAndValue string name string value 我需要使用反射将其作为 MethodInfo 获取 它尝试了以下操作 但没有找到构造函数 GetMethod回报null Metho
  • 当字段不完整时使用 Circe 解码 Json

    我有一份 json 格式的成绩单 里面有一堆单词 words duration 123 name world time 234 speaker null 我一直在使用 Circe 来编码 解码 Json 在这个特殊情况下 import io
  • 了解 OpenGL 引擎的 GLTF2.0 文件的蒙皮部分

    我有一个简单的混合器模型 它由三个网格组成 三个网格各控制一个网格 动画只是骨骼围绕 y 轴稍微旋转立方体并返回 中心骨骼是两个外部骨骼的父骨骼 然后 我使用 GLTF2 0 文本版本 导出插件导出此场景 现在尝试将其导入到我新制作的 op
  • Hbase 架构嵌套实体

    有谁有关于如何创建带有嵌套实体的 Hbase 表的示例吗 Example UserName string SSN string Books collection 例如 书籍收藏看起来像这样 Books isbn title etc 我找不到
  • Python、Java、C# 和并行算法

    我想知道 尝试用 Python 创建并行算法有什么优点吗 假设我想研究一种新的并行算法 并且我可以选择 C C 和 Python 那么其中一个或另一个 更好 来测试和基准测试这些算法 或者它们只是 功能上等效 而且除了与解释 编译 虚拟机语
  • Swagger springfox 在 POST 上隐藏模型属性

    想知道如何在 POST 时隐藏 Swagger 中的模型属性 我尝试过Swagger springmvc 0 9 3 和Springfox 支持swagger规范2 0 但均无济于事 问题是我想在通过 Swagger 的 GET 请求中看到
  • 从不同线程调用

    我不敢相信 这在我的其他应用程序中有效 但在这个具有类似结构的应用程序中 它不起作用 public string ListAdd set if listView1 InvokeRequired this Invoke MethodInvok
  • MySQL选择昨天的日期

    如何显示和统计日期为昨天的值 我用了time 在数据库中插入日期 例子 URL google com youtube com google com youtube com test com youtube com DateVisited 1
  • 在 Java 中打印数组

    我正在编写一个方法来打印它传递的每个对象 通过调用该方法可以正常工作Object toString 方法适用于对象 但不适用于数组 我可以找出它是否是一个数组Object getClass isArray 方法 但我不知道如何投射它 int
  • 继承的 CSS 属性的特殊性

    继承属性收到的 CSS 特异性级别是多少 我通读了有关 CSS 特异性的 W3 建议 因此我了解如何计算直接针对同一元素的 css 规则的不同特异性 但我没有看到其中提到继承属性的特异性级别 特别是 我遇到的问题与标题元素有关 尽管我很有兴
  • wpf按钮背景图片

    我有一个带有 5 个按钮的 wpf 页面 所有 5 个按钮必须具有相同的大小 并且必须具有相同的背景图像 这个怎么做 问候 卡恩 使用样式 这将自动应用于all窗口中的按钮
  • 如何在ansible命令中传递用户/密码

    我想使用 Ansible 作为另一个 Python 软件的一部分 在该软件中 我有一个主机列表及其用户 密码 有没有办法将 SSH 连接的用户 密码传递给 Ansible ad hoc 命令或以加密方式将其写入任何文件中 还是我理解错了 唯
  • 如何将变量从 awk 传递到 shell 命令?

    我正在尝试从 awk 中为文件的每一行运行 shell 命令 并且 shell 命令需要一个输入参数 我尝试使用system 但它无法识别输入参数 该文件的每一行都是一个文件的地址 我想运行一个命令来处理该文件 因此 对于一个简单的示例 我
  • 实体框架 - 我应该如何实例化我的“实体”对象

    我是实体框架和 ASP Net MVC 的新手 主要从教程中学习 但对两者都没有深入的了解 我确实有 Net 2 0 ADO Net 和 WebForms 的经验 我当前的怀疑来自于我实例化实体对象的方式 基本上我在我的控制器中这样做 pu