将EF查询时间记录到数据库

时间:2015-02-12 13:57:07

标签: c# sql entity-framework

我想将EF查询(或事务)时间记录回数据库,以便我可以监视实时系统中的性能。注意我知道在我的UOW中可能会发生多个查询。没关系,我只是想知道系统的哪些区域正在减速等等。

对我来说,最好的方法是什么?我最初的想法是在UnitOfWork.Dispose()中执行此操作,以便在完成后自动记录每个查询。但这对我来说有点气味,因为我必须打电话给Save()来保留信息,但如果来电者不想保存怎么办?

还有另一种更好的方法可以自动将查询时间记录到数据库中吗?

protected virtual void Dispose(bool disposing)
{
    if (this.logQueryToDatabase)
    {
        var timeTaken = DateTime.UtcNow - this.start;
        LogPerformance(this.callingFnName, timeTaken.TotalMilliseconds);
    }

    this.ctx.Dispose();
}

1 个答案:

答案 0 :(得分:1)

如果你知道要测量哪些动作,你可以创建一个简单的类来处理它。你所需要的只是环绕行动。

探查器类。

public class Profiler:IDisposable
{
    private readonly string _msg;
    private Stopwatch _sw;

    public Profiler(string msg)
    {
        _msg = msg;
        _sw = Stopwatch.StartNew();
    }

    public void Dispose()
    {
        _sw.Stop();
        LogPerformance(_msg, _sw.ElapsedMilliseconds);
    }
}

用法:

using (new Profiler("Saving products"))
{   
    db.SaveChanges();
}