15

我需要使用 petapoco 创建一个 DAL 和存储库。遇到的困难是我不知道它如何管理它的连接。

如果我使用的是 dapper,我知道连接过程是如何进行的,因为我控制它。我不知道用 petapoco 创建 DAL 的最佳实践是什么。

 public class UserRepository
    {
        public IEnumerable<User> All()
        {
            var db = new PetaPoco.Database("Sqlite_Connection");//this line
            var s = db.Query<User>("SELECT * FROM Users");
            return s.ToList();
        }
    }

我想将var db = new PetaPoco.Database("Sqlite_Connection");//this line 我的 DALHelper 类作为静态属性放置,但我担心可伸缩性

4

2 回答 2

12

我不建议使用静态,因为您可能会收到诸如“已经有一个打开的 DataReader 与此命令关联”之类的错误,因为访问相同资源的不同请求使用相同的连接。

两种选择:

1. 在控制器基类中创建连接

public class BaseController : Controller 
{
  protected DatabaseWithMVCMiniProfiler _database;

  protected override void OnActionExecuting(ActionExecutingContext filterCon ) 
  {
    base.OnActionExecuting( filterCon );

    _database = new DatabaseWithMVCMiniProfiler( "MainConnectionString");

  }
}

2. 静态方法每次请求创建一个连接

public static class DbHelper {
  public static Database CurrentDb() {
    if (HttpContext.Current.Items["CurrentDb"] == null) {
       var retval = new DatabaseWithMVCMiniProfiler("MainConnectionString");
       HttpContext.Current.Items["CurrentDb"] = retval;
       return retval;
    }
    return (Database)HttpContext.Current.Items["CurrentDb"];
  }
}
于 2012-04-03T14:32:02.330 回答
3

静态属性将适用于初始化。PetaPoco 每次都会打开和关闭连接,除非您正在使用事务。由于连接池,这通常不是问题。

如果您在 Web 应用程序中使用它,那么您应该为每个请求实例化一个 PetaPoco 数据库。

于 2011-08-14T01:17:07.900 回答