使用Dapper管理ASP.NET MVC中的SQLConnection

7

我正在使用MVC快速尝试Stack Overflow/Sam Saffron发布的新Dapper Micro ORM。我想知道在我的控制器内管理SQLConnection对象的最简单方法是什么?我只是为了快速浏览一些数据并测试Dapper而做了一些简单的事情,但像这样打开/关闭连接是否理想?

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);
    }
}
2个回答

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类或类似的类中,并从控制器调用它。


Luke,感谢你的回答。我只是在考虑一个非常小的CRUD应用程序,尽可能保持简单。 - aherrick
2
@aherrick:好的,我可能会做同样的事情。如果代码确实如此简单,那么添加额外的层和抽象通常会使事情变得更糟,而不是更好! - LukeH

0

我从未使用过它,但如果var comments在其执行中被延迟,则会出现问题,您将不得不使用类似于.ToList之类的东西来完全枚举结果以在关闭连接之前。 否则,如果.ExecuteMapperQuery在返回结果之前完全枚举结果,则一切都会很好。


感谢回复。是的,它完全枚举并返回一个T类型的列表。我更想知道的是,是否有更好/更清晰的方法来管理我的SQLConnection对象,并且每次都要打开/关闭给定的连接。 - aherrick
1
@aherrick,在基本控制器或外部助手中完成它...您不希望在单个页面上打开和关闭50次连接...即使使用池化,这也可能会变得昂贵。 - Sam Saffron
@SamSaffron 这样做可以吗?我在我的控制器中打开一个连接,然后在Dispose方法中释放它吗? - NoobDeveloper
@SamSaffron 我有点困惑。Jon Skeet在这篇文章中说:“最好的方法几乎总是在每次需要时创建一个新的SqlConnection - 并在完成后立即处理它”,链接如下:http://stackoverflow.com/questions/26925209/passing-sqlconnection-to-class-loses-its-connectionstring-after-dispose#26925209 - Xavier Egea

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