SharpRepository.EntityFramework 即使我告诉它不要缓存数据,我该如何防止呢?
SharpRepository.EntityFramework caches data even if I tell it not to, how can I prevent it?
我正在使用 SharpRepository.EntityFramework,默认配置。在 app.config 中定义了存储库,并且...它是一个大型应用程序,所以我只向您展示相关的代码片段:
IEnumerable<IntegrationQueue> queue_list =
qrepo.FindAll(item => item.IntegrationID == Integration.ID
&& (DateTime.Now > item.NextTry
&& item.Lock == false
&& item.Status != StatusEnum.Success && item.Status != StatusEnum.GaveUp)
|| item.Command != CommendEnum.None);
foreach (IntegrationQueue iq in queue_list)
{
Lock(iq);
Logger.Instance.Trace("Processing record " + iq.ToString());
所以这部分代码每15秒调用一次。它从数据库中获取需要处理的记录列表。
奇怪的是。假设我现在进入 SQL Management Studio 并更新记录并将 Command 设置为 0 以外的值 (None)。在下一次传递中,FindAll() 将在 queue_list 中获取一条记录!耶!
但后来我查看了记录,Command 是 0 (None)....
什么?如何??在该命令上触发的 FindAll() 是 != 0 (None) !
所以 FindAll() 匹配似乎有效,但它给了我一个缓存版本。太糟糕了。
我试过 qrepo.CacheEnabled = false,我试过 qrepo.ClearCache() 但无济于事。
我尝试使用 GetAll() 而不是 FindAll()(不确定到底有什么区别),但它甚至不会触发记录。
请指教?谢谢!
找到这个老话题了,记得标记sharp-repository!
问题与 SharpRepository 无关,如果您创建这样的普通应用程序:
var db = new DemoDbContext();
// check if John already exists
Person person = db.Persons.Single(item => item.Name == "John Smith");
if (person == null)
{
// otherwise create and add him
Person p = new Person()
{
Name = "John Smith",
Age = 25
};
db.Persons.Add(p);
}
// forever
while (true)
{
Person p = db.Persons.Single(item => item.Name == "John Smith");
Console.WriteLine("Found him by name! Age: " + p.Age);
Person p2 = db.Persons.Single(item => item.ID == 3);
Console.WriteLine("Got person ID 3! Age: " + p2.Age);
Console.WriteLine("Waiting three seconds...\n");
Thread.Sleep(1000 * 3);
}
你会有同样的行为。
解决方案是在每个循环中重新实例化 dbcontext(或存储库)或使用 AsNoTracking。
在 SharpRepository 中你可以调用 repo.AsQueryable().AsNoTracking()
或者在新的 2.1 预发布版本中,您可以在 FetchStrategy guide here
中设置
我正在使用 SharpRepository.EntityFramework,默认配置。在 app.config 中定义了存储库,并且...它是一个大型应用程序,所以我只向您展示相关的代码片段:
IEnumerable<IntegrationQueue> queue_list =
qrepo.FindAll(item => item.IntegrationID == Integration.ID
&& (DateTime.Now > item.NextTry
&& item.Lock == false
&& item.Status != StatusEnum.Success && item.Status != StatusEnum.GaveUp)
|| item.Command != CommendEnum.None);
foreach (IntegrationQueue iq in queue_list)
{
Lock(iq);
Logger.Instance.Trace("Processing record " + iq.ToString());
所以这部分代码每15秒调用一次。它从数据库中获取需要处理的记录列表。
奇怪的是。假设我现在进入 SQL Management Studio 并更新记录并将 Command 设置为 0 以外的值 (None)。在下一次传递中,FindAll() 将在 queue_list 中获取一条记录!耶!
但后来我查看了记录,Command 是 0 (None).... 什么?如何??在该命令上触发的 FindAll() 是 != 0 (None) !
所以 FindAll() 匹配似乎有效,但它给了我一个缓存版本。太糟糕了。
我试过 qrepo.CacheEnabled = false,我试过 qrepo.ClearCache() 但无济于事。
我尝试使用 GetAll() 而不是 FindAll()(不确定到底有什么区别),但它甚至不会触发记录。
请指教?谢谢!
找到这个老话题了,记得标记sharp-repository!
问题与 SharpRepository 无关,如果您创建这样的普通应用程序:
var db = new DemoDbContext();
// check if John already exists
Person person = db.Persons.Single(item => item.Name == "John Smith");
if (person == null)
{
// otherwise create and add him
Person p = new Person()
{
Name = "John Smith",
Age = 25
};
db.Persons.Add(p);
}
// forever
while (true)
{
Person p = db.Persons.Single(item => item.Name == "John Smith");
Console.WriteLine("Found him by name! Age: " + p.Age);
Person p2 = db.Persons.Single(item => item.ID == 3);
Console.WriteLine("Got person ID 3! Age: " + p2.Age);
Console.WriteLine("Waiting three seconds...\n");
Thread.Sleep(1000 * 3);
}
你会有同样的行为。
解决方案是在每个循环中重新实例化 dbcontext(或存储库)或使用 AsNoTracking。
在 SharpRepository 中你可以调用 repo.AsQueryable().AsNoTracking()
或者在新的 2.1 预发布版本中,您可以在 FetchStrategy guide here
中设置