如果手动修改数据库,则新的DbContext不会提取更新的数据

时间:2017-08-18 19:11:42

标签: c# asp.net asp.net-mvc entity-framework dbcontext

背景

我有一个中央数据库,我的MVC EF网络应用程序与以下最佳实践交互。这是违规代码:

// GET: HomePage
public ActionResult Index()
{
    using (var db = new MyDbContext())
    {
        return View(new CustomViewModel()
                {
                    ListOfStuff = db.TableOfStuff
                        .Where(x => x.Approved)
                        .OrderBy(x => x.Title)
                        .ToList()
                });
    }
}

我还在Web应用程序外部手动修改此数据库表中的数据。

我没有保留DbContext的实例,而不是获取所需数据所需的时间。每个请求构建一个新的。

问题

我遇到的问题是,如果我在网络应用程序外部手动删除行或修改此表中的任何数据,则上述代码提供的数据不会反映这些更改。

通过上述代码获取数据的这些手动编辑的唯一方法是重新启动Web应用程序,或使用Web应用程序对调用SaveChanges的数据库进行修改。

记录结果

在记录正在执行的查询并进行一些手动测试之后,生成的查询没有任何问题会导致返回错误的数据。

但是,在日志记录中,我在查询完成时间中看到了一个令人困惑的行。关于应用启动的第一个查询:

-- Completed in 86 ms with result: CachingReader

然后任何后续查询都有以下完成时间:

-- Completed in 0 ms with result: CachingReader

这是CachingReader是什么以及如何禁用此功能?

1 个答案:

答案 0 :(得分:0)

<强>元凶

我发现错误是在我的网络应用中的其他位置引入的,因为它取代了基础DbProviderServices以提供缓存,更具体地说,我使用MVCForum使用EF Cache

此论坛的CachingConfiguration使用默认的CachingPolicy来缓存所有内容,除非通过EF进行交互,这是我观察到的确切行为。 More Info

<强>解决方案

我提供了自己的自定义CachingPolicy,它不允许在不希望出现此行为的实体上进行缓存。

public class CustomCachingPolicy : CachingPolicy
{
    protected override bool CanBeCached(ReadOnlyCollection<EntitySetBase> affectedEntitySets, string sql, IEnumerable<KeyValuePair<string, object>> parameters)
    {
        foreach (var entitySet in affectedEntitySets)
        {
            var table = entitySet.Name.ToLower();

            if (table.StartsWith("si_") ||
                table.StartsWith("dft_") ||
                table.StartsWith("tt_"))
                return false;
        }

        return base.CanBeCached(affectedEntitySets, sql, parameters);
    }
}

有了这个,数据库记录现在总是显示:

-- Completed in 86 ms with result: SqlDataReader

谢谢大家!