oData查询和Disposable SQL连接

时间:2015-09-09 08:51:41

标签: c# connection odata asp.net-web-api2 dispose

使用WebApi 2.0实现oData服务时,标准做法是将IQueryable从您的服务公开给ApiControllers'行动。这样,框架可以将oData查询应用于您的IQueryable。

我目前正在阅读有关始终在数据库连接上调用Dispose的重要性。最好使用"使用"这样的陈述:

using (SqlConnection connection = new SqlConnection(connectionString))
{
     connection.Open();
     // Execute operations against the database
} // Connection is automatically closed.

我的问题是:在oData的情况下,数据库连接何时关闭?在框架应用oData查询之前,您显然无法自行配置连接 - 这会引发异常。

一个侧面话题是:你是否同意公开IQueryable<>从您的服务?我已经读过这个并且这是一个长期争论的问题 - 人们认为数据库工作应该包含在存储库中,而其他人则希望提供查询服务的自由。客户端。我同意在存储库中包含查询,但是在oData的情况下,我不想过于复杂化,如果框架特定IQueryable,那么我给它IQueryable。你怎么看 ?

1 个答案:

答案 0 :(得分:1)

通常在这种情况下,在处理asp.net控制器实例时关闭数据库连接。假设您使用Entity Framework上下文来执行查询。然后在需要时创建(可能是懒惰)该上下文实例,然后重写ODataController的Dispose方法并将其置于那里。例如,请看一下这篇文章:http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/odata-v4/create-an-odata-v4-endpoint

我个人从不使用这种方法,因为我更喜欢对允许的操作进行更多控制。但是,在某些情况下,通过所描述的IQueryable方法允许对某些表进行读访问是没有害处的 - 如果在客户端上您有丰富的过滤可能性。在这种情况下,无论如何,您将重新发明这种方法,因为您将使用一些自定义过滤器,或接受查询方法的大量参数。