如何使用 petapoco 创建 DAL [关闭]

Posted

技术标签:

【中文标题】如何使用 petapoco 创建 DAL [关闭]【英文标题】:how to create a DAL using petapoco [closed] 【发布时间】:2011-10-26 12:16:33 【问题描述】:

我需要使用 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 类中作为静态属性,但我担心可伸缩性

【问题讨论】:

【参考方案1】:

我不建议使用静态,因为您可能会收到像 "There is already an open DataReader associated with this Command" 这样的错误,因为访问相同资源的不同请求使用相同的连接。

两种选择:

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"];
  

【讨论】:

感谢 Eduardo,让我再次对 PetaPoco 充满信心,也刚刚发现这个 SO,建议每个请求使用 1 个 petapoco.database 实例:***.com/questions/7126205/… PetaPoco 太棒了。我现在在几个项目中都在使用它,并且在各种场景中都能很好地工作。【参考方案2】:

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

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

【讨论】:

我在生产中以这种方式使用它来处理 DAL 操作之间的嵌套事务,它工作正常。 我(和其他人)发现使用静态(如在每个应用程序中)有问题。看我的回答。

以上是关于如何使用 petapoco 创建 DAL [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

使用 PetaPoco 插入时如何处理数据库中的 DEFAULT 值?

如何在 ASP.NET MVC 中组织 DAL [关闭]

PetaPoco join连接问题

如何对使用 PetaPoco.Database 的服务进行单元测试

如何在 PetaPoco 中检索 xml 列

PetaPoco:如何使用 SQL Like 关键字(WHERE Name LIKE '%@0%')