好的建立多个数据上下文?

时间:2013-06-13 14:25:12

标签: c# sql-server performance datacontext

给出以下代码:

public static void SomeLoop()
{
    using(var db = new ArcadeContext())
    {
        var changeRecs = db.ArcadeGameRanks.Where(c => c.Date == today);
        foreach (var rankRecord in changeRecs)
        {
            var rank = SomeMethod(rankRecord.GameID);
            UpdateGamesCatRank(rankRecord.GameID, rank);
        }
    }
}

public static void UpdateGamesCatRank(int gameID, int catRank)
{
    using(var db = new ArcadeContext())
    {
        db.ExecuteCommand("UPDATE ArcadeGame SET CategoryRank = " + catRank + " WHERE ID = " + gameID);
    }
}

当我运行SQL Server Profiler时,我收到了很多重复的Audit LoginAudit Logout消息,这些消息似乎会影响性能:

enter image description here

我是用C#自学的,所以我知道我很有可能做非典型的事情。

我的问题是,上述设计模式是否被认为是好的?或者我应该重复/传递数据上下文作为函数的参数,以便每次调用函数时都不需要重新建立它们? (如果我假设重复创建新数据上下文是登录和注销的原因)。

2 个答案:

答案 0 :(得分:1)

由于您的上下文已经实例化,请将其传递给您的方法。

public static void SomeLoop()
{
    using(var db = new ArcadeContext())
    {
        var changeRecs = db.ArcadeGameRanks.Where(c => c.Date == today);
        foreach (var rankRecord in changeRecs)
        {
            var rank = SomeMethod(rankRecord.GameID);
            UpdateGamesCatRank(rankRecord.GameID, rank, db);
        }
    }
}

public static void UpdateGamesCatRank(int gameID, int catRank, ArcadeContext db)
{
    db.ExecuteCommand("UPDATE ArcadeGame SET CategoryRank = " + catRank + " WHERE ID = " + gameID);
}

这将通过在完成foreach循环时处理上下文来执行查询,返回和解析。

答案 1 :(得分:0)

不是个好主意。这可能只是一个例子来说明你的观点,但我认为不需要一个全新的方法来执行一个sql命令。只需将该命令放入循环中即可。为每次调用实例化一个新的数据库上下文会破坏你的性能。