我无法完全理解我们应该使用" using
"阻止在这里
以下代码用于显示两个表名"类型"和"评论"使用EF
从数据库中获取是代码:
C#
protected void Page_Load(object sender, EventArgs e)
{
using (PlanetWroxEntities myEntities = new PlanetWroxEntities())
{
var authorizedReviews = from review in myEntities.Reviews
where review.Authorized == true
orderby review.CreateDateTime descending
select review;
GridView1.DataSource = authorizedReviews.ToList();
GridView1.DataBind();
}
}
这是作者的一些解释:
生成模型后,您可以执行LINQ查询 反对它从底层数据库中获取数据。访问 数据,你需要一个
DbContext
类的实例,这是基础PlanetWroxEntities
类的类。该实例已创建 在代码中的Using块内。使用块(在C#中使用)是 用于包装创建必须处理的变量的代码 一旦你完成它,就会从记忆中清除。因为myEntities
变量与SQL Server保持(稀缺)连接 数据库,最好将使用它的代码包装在一个Using中 阻止,所以对象在块的末尾被破坏了 已发布连接。此myEntities
对象会公开您可在查询中使用的数据(例如评论和流派):
我有两个问题:
1-为什么我们应该摆脱变量?是因为它占用了内存空间?或者是因为它与SQL Server数据库保持连接,所以我们不需要对象而只需要连接?
2-这意味着什么"连接被释放"?如果连接是对象的一部分,为什么它也没有被破坏?
答案 0 :(得分:3)
1)using语句的原因是确保在using语句中的代码完成后立即调用myEntities.Dispose()
方法。这是必要的,因为PlanetWroxEntities
类'基类是DbContext
,它保存与数据库的连接。
数据库连接是从数据库连接池获得的宝贵资源,并且只有有限数量的连接可供您的整个应用程序共享。如果您通过using语句(或其他方式)在完成Dispose
对象后不立即调用myEntities
,那么myEntities
对象将继续占用这个数据库连接有一段不确定的时间,直到来自.net内存管理器的垃圾收集代码到处回收由不再使用的myEntities
对象所占用的内存。
内存管理器将在那时调用dispose方法。调用Dispose方法后,数据库连接将从对象释放并返回到数据库连接池,当您调用获取数据库连接时(例如创建时),应用程序的其他部分可以获取该数据库连接PlanetWroxEntities
类的其他实例。)
using语句的目的是在完成对象后立即调用Dispose
方法,以便在这种情况下立即将数据库连接返回到池中。
2)这意味着您的应用程序将释放数据库连接,并将其返回到数据库连接池,现在可以通过应用程序的其他部分获取它。这是一个可以更多地讨论连接池的资源,它将为您提供有关幕后内容的更多背景知识:https://msdn.microsoft.com/en-us/library/8xx3tyca.aspx
在幕后,using语句被实现为finally语句。所以这段代码:
using (PlanetWroxEntities myEntities = new PlanetWroxEntities())
{
var authorizedReviews = from review in myEntities.Reviews
where review.Authorized == true
orderby review.CreateDateTime descending
select review;
GridView1.DataSource = authorizedReviews.ToList();
GridView1.DataBind();
}
变为
PlanetWroxEntities myEntities;
try{
myEntities = new PlanetWroxEntities();
var authorizedReviews = from review in myEntities.Reviews
where review.Authorized == true
orderby review.CreateDateTime descending
select review;
GridView1.DataSource = authorizedReviews.ToList();
GridView1.DataBind();
} finally{
myEntities.Dispose();
}
在C#的旧时代,我们总是不得不自己编写finally语句来处理一次性对象,以便释放他们的非托管资源。但后来在C#中引入了using语句,以便更容易实现。即使在今天,如果您愿意,也可以自己编写最终声明,但大多数人都喜欢使用声明。
有关详细信息,请参阅https://msdn.microsoft.com/en-us/library/yh598w02.aspx
答案 1 :(得分:2)
PlanetWroxEntities
实施IDisposable
。
IDisposable
由包含当您完成对象时需要释放的本机资源的类实现。
所以,回答#1:你应该尽快“摆脱”变量,这样你就不会保留可以释放回系统的原生资源。
using
语句可确保在您完成使用实体后正确调用Dispose()
。您不仅要释放连接,还要释放任何其他本机资源。
答案 2 :(得分:1)
为什么我们应该摆脱变量?
是因为它占用了内存空间吗?
是
或是因为它与SQL Server数据库保持连接 我们不需要对象而只需要连接?
作业(填充网格)在GridView1.DataBind();
之后你不需要对象或连接。
“连接被释放”是什么意思?如果连接是对象的一部分,为什么它也不会破坏呢?
对象myEntities
以及它与数据库的连接被销毁。
通常,EF查询返回的实体可以生成进一步的数据库查询。这称为延迟加载。
在using语句中包装EF查询可防止延迟加载发生 - 让您了解数据库查询仅在存储库中发生。