使用Linq的BLToolkit为什么需要一个`using`语句?

3

鉴于SubSonic 3最近(极端)的性能问题,我们正在寻求迁移ORM,最好尽可能少地重写代码(主要是Linq)。

因此,我正在研究BLToolkit。但我发现SubSonic和BLToolkit之间的一个主要区别在于,BLToolkit始终需要using语句。例如:

static void SingleTableTest()
{
    using (var db = new NorthwindDB()) //This
    {
        var query =
            from e in db.Employee
            where e.EmployeeID > 5
            orderby e.LastName, e.FirstName
            select e;

        foreach (var employee in query)
        {
            Console.WriteLine("{0} {1}, {2}", employee.EmployeeID, employee.LastName, employee.FirstName);
        }
    }
}

这段内容的意思是什么?当你创建一个新的数据库实例时,它会创建一个新的连接吗?将其封装为静态类是否合理,以便可以在任何地方执行var q=from e in Database.Employee ...?这对于Web应用程序有什么影响呢?

1
这与将连接范围限定在尽可能小的工作单元的思想有关。我对这个框架不是很熟悉,但很可能它们会像EF或LinqToSql一样为您管理连接。 - Brian Dishaw
根据我对代码的理解,每个new db语句都会创建一个新的连接。我查看了SubSonic的代码,他们使用了一个自制的"SharedConnectionScope"来实现自动打开和关闭连接。 - Earlz
这可能会每次创建一个新的数据库连接对象实例,但不应该创建一个全新的到数据库服务器的网络连接。.NET默认使用连接池。 - Joe White
@Joe,所以这不是一个需要担心的大问题吗?也就是说,每个HTTP请求中创建多个数据库对象并不是什么大问题(当然,在可能的情况下使用相同的连接更好)。 - Earlz
连接池会在可能的情况下负责使用相同的网络连接。但是你需要使用 using 块,以便连接池知道你已经完成了第一个连接对象(以及它所封装的网络连接),并且准备好被重用。 - Joe White
2个回答

4

我猜测你的示例中的NorthwindDB类基于DbManager。DbManager是Connection的包装器,行为像一个连接。你应该尝试另一个类 - DataContext。它专门为你的场景设计。


有没有办法使T4模板(BLToolkit附带的模板)生成类似于扩展DbManager一样的扩展DataContext? - Earlz
在您的模板中,在LoadMetadata(); / GenerateModel();之前添加BaseDataContextClass =“DataContext”; - IT.

0

我不了解BLToolkit,但是从你的评论中可以看出,你想知道是否可以只使用一个对象来处理HTTP请求,使用Entity Framework就可以实现。你可以在global.asax的Application_BeginRequest事件中创建一个db对象,而不是使用语句。在Application_EndRequest中释放它。你可以将对象存储在HttpContext.Current.Items中,这是一个方便的每个请求集合。

正如我所说,我不知道这是否适用于BLToolkit,因为我对它一无所知,但希望这足以指引你正确的方向。 :)


嗯,看起来你可以这样做……也许。问题在于只有当它保持SqlReader打开时才会出现问题。我可能会尝试一下,看看是否会出现任何故障。 - Earlz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接