0

给定以下代码:

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

在此处输入图像描述

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

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

4

2 回答 2

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 循环后通过处理上下文来执行您的查询、返回和解析。

于 2013-06-13T14:29:55.400 回答
0

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

于 2013-06-13T14:31:34.030 回答