2011-04-19 77 views
7

我正在给堆栈溢出/ Sam Saffron发布的新的Dapper Micro ORM快速使用MVC。我想知道在我的控制器中管理SQLConnection对象的最简单方法是什么?我正在做一些简单的事情,只是为了旋转一些数据并测试Dapper,但是打开/关闭连接是否是这样的想法?ASP.NET MVC使用Dapper管理SQLConnection

public class HomeController : Controller 
{ 
    SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["ajh"].ConnectionString); 

    public HomeController() 
    { 
    } 

    public ActionResult Index() 
    { 
     // get me all comments 
     conn.Open(); 
     var comments = conn.ExecuteMapperQuery<Comment>("select * from Comment"); 
     conn.Close(); 

     return View(comments); 
    } 
} 

回答

9

只需创建,打开,作为本地关闭连接尽可能:

public class HomeController : Controller 
{ 
    public HomeController() 
    { 
    } 

    public ActionResult Index() 
    { 
     List<Comment> comments; 
     using (var conn = new SqlConnection(/* ... */)) 
     { 
      conn.Open(); 
      comments = conn.ExecuteMapperQuery<Comment>("select * from Comment"); 
     } 
     return View(comments); 
    } 
} 

虽然这是最好的做法,以避免直接数据访问你的控制器。在CommentsService课程或类似内容中填写您的数据访问方法,并从您的控制器中调用。

+0

卢克感谢您的答案。我只是想一个非常小的CRUD应用程序尽可能简单。 – aherrick 2011-04-19 13:44:48

+2

@aherrick:够公平的,我可能也会这样做。如果代码真的很简单,那么添加额外的图层和抽象往往会让事情变得更糟,而不是更好! – LukeH 2011-04-19 13:46:45

0

我从来没有使用过它,但var comments在其执行被延迟,那么你就会有问题,将不得不使用像.ToList关闭连接之前完全列举的结果。否则,如果.ExecuteMapperQuery返回他们之前完全列举的结果,你会被罚款

+0

感谢您的回应。是的,它完全枚举并返回一个T列表。我想知道更多,所以有一个更好/更干净的方式来管理我的SQLConnection对象,并不得不每次打开/关闭给定的连接。 – aherrick 2011-04-19 13:41:30

+1

@aherrick,只是在一个基础控制器或外部帮手...你不想在一个页面上打开和关闭连接50次...即使使用池可能会变得昂贵 – 2011-04-24 01:39:45

+0

@SamSaffron是否可以如果我在控制器中打开连接并将其置于Dispose方法中? – NoobDeveloper 2013-07-31 16:59:16