- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
更新 - 答案显然是 DbLinq 没有实现 Dispose()
适本地。哦!
以下内容具有误导性 - 底线:DbLinq(目前)还不等同于 LinqToSql,正如我最初问这个问题时所假设的那样。谨慎使用!
我正在将存储库模式与 DbLinq 一起使用。我的存储库对象实现 IDisposable
, 和 Dispose()
方法只做一件事——调用 Dispose()
在 DataContext
上.每当我使用存储库时,我都会将其包装在 using
中 block ,像这样:
public IEnumerable<Person> SelectPersons()
{
using (var repository = _repositorySource.GetPersonRepository())
{
return repository.GetAll(); // returns DataContext.Person as an IQueryable<Person>
}
}
此方法返回 IEnumerable<Person>
,所以如果我的理解是正确的,直到 Enumerable<Person>
才真正查询数据库。被遍历(例如,通过将其转换为列表或数组或通过在 foreach
循环中使用它),如本例所示:
var persons = gateway.SelectPersons();
// Dispose() is fired here
var personViewModels = (
from b in persons
select new PersonViewModel
{
Id = b.Id,
Name = b.Name,
Age = b.Age,
OrdersCount = b.Order.Count()
}).ToList(); // executes queries
在这个例子中,Dispose()
在设置 persons
后立即被调用,这是一个 IEnumerable<Person>
,这是它唯一一次被调用。
那么,三个问题:
DataContext
在 DataContext
之后仍然在数据库中查询结果已经处置了吗?Dispose()
真的吗?DataContext
,但我的印象是这不是一个坏主意。有什么理由不处理 DbLinq DataContext
?最佳答案
1 How does this work? How can a disposed DataContext still query the database for results after the DataContext has been disposed?
它不起作用。有些东西你没有给我们看。我猜要么是你的存储库类没有正确/在正确的时间处理 DataContext
,要么是你在每个类的末尾敷衍地写了 ToList()
查询,这完全否定了您通常获得的查询转换和延迟执行。
在测试应用中尝试以下代码,我保证你会抛出 ObjectDisposedException
:
// Bad code; do not use, will throw exception.
IEnumerable<Person> people;
using (var context = new TestDataContext())
{
people = context.Person;
}
foreach (Person p in people)
{
Console.WriteLine(p.ID);
}
这是最简单的可重现案例,它总是会抛出。另一方面,如果您改为编写 people = context.Person.ToList()
,则查询结果已经在 inside 中枚举了 using
阻止,我敢打赌你的情况就是这样。
2 What does Dispose() actually do?
除其他事项外,它设置了一个标志,指示 DataContext
已处理,在每个后续查询中检查该标志,并导致 DataContext
抛出 ObjectDisposedException
消息 Object name: 'DataContext accessed after Dispose.'。
如果 DataContext
打开并保持打开状态,它也会关闭连接。
3 I've heard that it is not necessary (e.g., see this question) to dispose of a DataContext, but my impression was that it's not a bad idea. Is there any reason not to dispose of a LinqToSql DataContext?
有必要Dispose
DataContext
,因为有必要Dispose
每隔一个 IDisposable
。如果未能处理 DataContext
,则可能会泄漏连接。如果从 DataContext
检索到的任何实体保持事件状态,您也可能会泄漏内存,因为上下文为其实现的工作单元模式维护内部身份缓存。但是,即使这一切都不是这种情况,您也不关心 Dispose
方法在内部做了什么。假设它做了一些重要的事情。
IDisposable
是一个契约(Contract),上面写着“清理可能不是自动的;你需要在完成后处置我。”如果您忘记 Dispose
,您无法保证该对象是否有自己的终结器在您之后进行清理。实现可能会发生变化,这就是为什么依赖观察到的行为而不是明确的规范不是一个好主意。
如果您使用空的 Dispose
方法处理 IDisposable
可能发生的最糟糕的事情是您浪费了几个 CPU 周期。如果您未能使用非平凡实现处理IDisposable
,可能发生的最糟糕的事情是您泄漏了资源。这里的选择是显而易见的;如果您看到 IDisposable
,请不要忘记处理它。
关于c# - 为什么可以在 DataContext 上调用 Dispose() 后枚举 DbLinq 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2851755/
我有一个MySql数据库,其一般结构如下: Manufacturer <== ProbeDefinition <== ImagingSettings ElementSettings ====^
我们正在开发一个带有 C# 代码的 ASP.NET Web 应用程序。数据库是MySQL 5.1,使用InnoDB。数据访问层使用 ADO.NET 调用存储过程,然后根据结果集构建各种数据结构(无对象
我有一个通过 DbLinq 连接到 MySQL 数据库的 ASP.NET MVC2 站点。网站上有一组定期完成的特定操作,包括循环处理几个表中的一组特定记录并更新它们,以及在其他一些表中添加一些新记录
我正在开发一个需要与数据库对话的应用程序。该应用程序是用 C# 编写的。我非常喜欢 LINQ 和自动生成类来表示数据库及其表,所以首先我考虑使用 SQL,因为 .NET 仅支持 LINQ to SQL
我正在开发一个需要与数据库对话的应用程序。该应用程序是用 C# 编写的。我非常喜欢 LINQ 和自动生成类来表示数据库及其表,所以首先我考虑使用 SQL,因为 .NET 仅支持 LINQ to SQL
有人可以发布一个使用 DBLinq、SQLite 进行工作连接的小代码示例吗?我已经在 VS 2010 WPF 环境中努力让它启动并运行两天了。我想我已经解决了连接字符串,但很想看到示例的启动和运行。
我试过了 db.Table1.GroupJoin(db.Table2, t1 => t1.Id, t2 => t2.t1Id, (t1,g) => new { t1, g })
我对数据库编程不是很熟悉,但我有一个Mysql数据库,我在C#下使用Dblinq访问它。现在,当我输入日期、数字等时,使用英语符号,但我的客户需要德语。如何将我的数据库从英语切换为德语? (数据库仍然
请提供命令行工具 dbmetal 从 sqlite 数据库生成代码文件的示例。 最佳答案 上网冲浪我发现了以下命令: DBMetal.exe /namespace:Namespace /provide
我已经(经过一些重大努力)让 DbLinq 在 OS X 上使用最新版本的 Mono。 有没有人通过 DbLinq/Sqlite 成功创建数据库实体? 例如,我有下表: CREATE TABLE Us
我尝试使用 DbLinq 创建 linq-to-sqlite dbml但徒劳无功。每次我遇到不同类型的错误。可能是我哪里错了。 谁能告诉我从 Dblinq 源代码创建 dbml 文件的分步过程。 最佳
当我 bool? isApproved = null; db.Table.Where(item => item.IsApproved == isApproved).Count(); 最后一行的值为0。
我正在通过 DbLINQ 使用 LINQ to SQL (PostgreSQL)。 我在执行 LINQ to PostgreSQL 时遇到问题。我用 dbmetal 成功生成了 .dbml 和 .cs
我在 Mac OS 上使用 Mono/MonoDevelop,我想要一个使用 SqlMetal(Mono 附带的 DbLinq 版本)的示例,用于 LINQ-to-SQL 和 MySQL 数据库。 奇
我一直在试图弄清楚如何在 Windows 应用商店应用程序中为 ORM 数据库访问工作获得一个像样的 LINQ。 我发现的只是 SQLite 和 sqlite-net NuGet 包。后者有点糟糕,因
更新 - 答案显然是 DbLinq 没有实现 Dispose()适本地。哦! 以下内容具有误导性 - 底线:DbLinq(目前)还不等同于 LinqToSql,正如我最初问这个问题时所假设的那样。谨慎
我是一名优秀的程序员,十分优秀!