我正在使用实体框架代码优先,我调用编辑用户,在编辑用户内部我调用正在编辑用户的存储过程。之后,我调用另一种方法从数据库中获取用户。
问题是这个方法返回旧用户所以我认为我需要在调用第二个方法之前刷新上下文。我如何刷新实体框架中的上下文?
基于此页面: Entity Framework Refresh context?
我尝试使用它:
yourContext.Entry(yourEntity).Reload();
但我不确定如何准确地做到这一点。
这是我的背景:
var newUser = await authenticationContext.Users.Where(u => u.Email == "user1@test.com").FirstOrDefaultAsync();
我试过了:
authenticationContext.Entry(authenticationContext.Users).Reload();
但它正在抛出错误。
System.InvalidOperationException:实体类型Dbset不是当前上下文模型的一部分。
答案 0 :(得分:0)
您是否尝试重新初始化上下文?
var newUser = await authenticationContext.Users.Where(u => u.Email == "user1@test.com").FirstOrDefaultAsync();
// do cool stuff with sprocs and whatnot here
authenticationContext = new AuthenticationContext(); // Or whatever your context model looks like
var newUser = await authenticationContext.Users.Where(u => u.Email == "user1@test.com").FirstOrDefaultAsync();
或者只是使用“使用”,你想要总是新鲜的数据,而不是将上下文保持为字段?
using (var authenticationContext = new AuthenticationContext())
{
var newUser = await authenticationContext.Users.Where(u => u.Email == "user1@test.com").FirstOrDefaultAsync();
}
您尝试过的方法是重新加载EF跟踪器中存在的单个实体。您无法为该方法提供DbSet。如果您将一个实体附加到跟踪器,我想您会使用该方法:
var newUser = await authenticationContext.Users.Where(u => u.Email == "user1@test.com").FirstOrDefaultAsync();
// do cool stuff with sprocs and whatnot here
authenticationContext.Entry(newUser).Reload();
如上所述,您可能需要考虑导航道具。此外,您需要记住,如果您更改EF用于跟踪实体的值(我认为它是主键,但我不确定),您可能会得到不需要的结果。
这就是你可以用代码做的事情。但是你应该清楚地考虑评论中的建议,必须获取你应该已经表明代码味道的数据。此外,我还没有测试任何这个,希望它有效和/或你得到它的要点。