gpt4 book ai didi

entity-framework - Entity Framework - 我应该如何实例化我的 "Entities"对象

转载 作者:行者123 更新时间:2023-12-03 13:29:13 31 4
gpt4 key购买 nike

我是 Entity Framework 和 ASP.Net MVC 的新手,主要从教程中学习,对任何一个都没有深入了解。 (我确实有 .Net 2.0、ADO.Net 和 WebForms 方面的经验)

我目前的疑问来自我实例化我的实体对象的方式。

基本上我在我的 Controller 中这样做:

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() 子句显式处理它?

谢谢!

最佳答案

Controller 本身实现 IDisposable。因此,您可以重写 Dispose 并处置您在实例化 Controller 时初始化的任何内容(如对象上下文)。

Controller 只存在一个请求。因此,在 Action 中使用 using 并为整个 Controller 拥有一个对象上下文是完全相同数量的上下文:1。

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

相反,如果您在初始化 Controller 时初始化 ObjectContext(或编写延迟初始化代码使其在操作运行时初始化)并在 Controller.Dispose 中处置 ObjectContext,那么当 View 被渲染。在这种情况下,将 IQueryable 传递给 View 是安全的。 Controller 将在 View 渲染后不久被释放。

最后,如果我没有指出让您的 Controller 完全了解 Entity Framework 可能是一个坏主意,那我将是失职。考虑为您的模型和存储库模式使用单独的程序集,以使 Controller 与模型对话。谷歌搜索会在这方面出现很多。

关于entity-framework - Entity Framework - 我应该如何实例化我的 "Entities"对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1401327/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com