我正在尝试让MVCMiniProfiler与PetaPoco一起工作
我试图在创建PetaPoco DB时设置连接,但遇到了问题(connectionClosed)
public class DbHelper
{
static Database _CurrentDb = null;
public static Database CurrentDb()
{
if (_CurrentDb == null)
{
string connstr = ConfigurationManager.ConnectionStrings["MainConnectionString"].ConnectionString;
var conn = ProfiledDbConnection.Get(new SqlConnection(connstr));
_CurrentDb = new PetaPoco.Database(conn);
}
return _CurrentDb;
}
}我已经阅读了这个项目的https://github.com/toptensoftware/PetaPoco/issues/44,但可以让它工作
什么才是正确的方法呢?
编辑
该解决方案由Gareth Elms提供:
public class DbHelper
{
static Database _CurrentDb = null;
public static Database CurrentDb()
{
if (_CurrentDb == null)
{
_CurrentDb = new DatabaseWithMVCMiniProfiler("MainConnectionString");
}
return _CurrentDb;
}
}
public class DatabaseWithMVCMiniProfiler : PetaPoco.Database
{
public DatabaseWithMVCMiniProfiler(IDbConnection connection) : base(connection) { }
public DatabaseWithMVCMiniProfiler(string connectionStringName) : base(connectionStringName) { }
public DatabaseWithMVCMiniProfiler(string connectionString, string providerName) : base(connectionString, providerName) { }
public DatabaseWithMVCMiniProfiler(string connectionString, DbProviderFactory dbProviderFactory) : base(connectionString, dbProviderFactory) { }
public override IDbConnection OnConnectionOpened( IDbConnection connection)
{
// wrap the connection with a profiling connection that tracks timings
return MvcMiniProfiler.Data.ProfiledDbConnection.Get( connection as DbConnection, MiniProfiler.Current);
}
}发布于 2011-08-21 01:34:54
我想知道这是不是因为它是一个静态类。这可能是一些奇怪的连接在请求后自动关闭,以及petapoco的_sharedConnectionDepth计数器不知道它。我很容易用你的代码重现了这段代码。在github https://github.com/GarethElms/PetaPoco----A-simple-web-app上看看我的示例petapoco应用程序,我所要做的就是在基本控制器中实例化数据库
发布于 2012-02-15 17:34:40
如前所述,per请求对于mvc应用程序来说是最好的。这是我使用Ninject的实现
private static void RegisterServices(IKernel kernel)
{
#if DEBUG
kernel.Bind<IDatabase>().To<DebugDatabase>()
.InRequestScope()
.WithConstructorArgument("connectionStringName", "DebugCnnString");
#else
kernel.Bind<IDatabase>().To<ReleaseDatabase>()
.InRequestScope()
.WithConstructorArgument("connectionStringName", "ReleaseCnnString");
#endif
}
public class DebugDatabase : PetaPoco.Database
{
public DebugDatabase(string connectionStringName) : base(connectionStringName) { }
public override IDbConnection OnConnectionOpened(IDbConnection connection)
{
// wrap the connection with a profiling connection
return new ProfiledDbConnection(connection as DbConnection, MiniProfiler.Current);
}
}
public class ReleaseDatabase : PetaPoco.Database
{
public ReleaseDatabase(string connectionStringName) : base(connectionStringName) { }
// ... some stuff
}https://stackoverflow.com/questions/7126205
复制相似问题