0

我正在使用具有默认配置的 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(无)以外的值。在下一次传递中, FindAll() 将在 queue_list 中获得一条记录!耶!

但后来我查看了记录,命令为 0(无).... 什么?如何??该命令触发的 FindAll() 是 != 0 (None) !

所以 FindAll() 匹配似乎有效,但它给了我一个缓存版本。那很不好。

我尝试了 qrepo.CacheEnabled = false,我尝试了 qrepo.ClearCache() 但无济于事。

我尝试使用 GetAll() 而不是 FindAll() (不确定到底有什么区别),但它甚至不会触发记录。

请指教?谢谢!

4

1 回答 1

1

我发现了这个老话题,记得标记它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指南中设置

于 2019-10-28T09:10:39.490 回答