重用实体查询

本文关键字:查询 实体 | 更新日期: 2023-09-27 18:30:55

我正在使用实体框架来访问我的MSSQL DB。在一个函数中,查询被调用两次。同时,相应的数据会发生变化。当我尝试再次执行查询时,它仍然返回与最初相同的值:(Umfragen 是类)

Umfrage Survey = await db.Umfragen.FindAsync(SurveyId);          
SqlCommand Command = new SqlCommand("UpdateSurvey", ConnectionString);
Command.CommandType = CommandType.StoredProcedure;                   
using (ConnectionString)
{
      ConnectionString.Open();
      Command.ExecuteNonQuery();
      return Ok(await db.Umfragen.FindAsync(SurveyId));                                    
}

某些参数需要第一次调用。它怎么可能不返回新值?当我不执行第一次调用并预定义参数时,它可以正常工作。

提前感谢,如果我的问题应该是重复的,我很抱歉,我找不到任何其他关于这个问题的问题......

重用实体查询

FindAsync文档指出

异步查找具有给定主键值的实体。如果上下文中存在具有给定主键值的实体,则会立即返回该实体,而无需向存储发出请求。否则,将向存储发出具有给定主键值的实体的请求,并且此实体(如果找到)将附加到上下文并返回。如果在上下文或存储中找不到实体,则返回 null。

在您的情况下,对 FindAsync 的第一次调用会在上下文中加载实体,因此即使稍后在数据库中更新该实体,第二个FindAsync也会返回相同的缓存实例。

为了刷新缓存的实例,您可以使用 DbEntityEntry.ReloadAsync 方法,如下所示

Umfrage Survey = await db.Umfragen.FindAsync(SurveyId);          
SqlCommand Command = new SqlCommand("UpdateSurvey", ConnectionString);
Command.CommandType = CommandType.StoredProcedure;                   
using (ConnectionString)
{
    ConnectionString.Open();
    Command.ExecuteNonQuery();
    await db.Entry(Survey).ReloadAsync();  
    return Ok(Survey);                                    
}