更新实体未被实体框架跟踪

时间:2017-10-26 01:52:38

标签: c# entity-framework .net-core

我正在使用.NET Core 2.0和Entity Framework Core构建API。

我有一个用户数据库。当调用登录URI时,我在数据库中找到用户如下:

User user = _usersRepository.GetUserByEmail(model.Email); 

然后我创建一个令牌(Guid),它存储在我刚刚获取的用户对象旁边的字典中。令牌将返回给使用者,然后需要授权。

对于需要授权的控制器操作,自定义属性从字典中获取当前用户对象(使用其标记)并使用HttpContext.Items将其传递给控制器​​。

我现在已经在控制器中登录了当前用户对象。

在控制器内部,我想更改此用户对象的属性,然后更新该用户的数据库条目。

这是我希望能够做到的(简化):

User authenticatedUser = HttpContext.Items.TryGetValue("authenticatedUser" ...)
authenticatedUser.Username = "John Doe";  
_usersRepository.SaveChanges(); 

下面的工作,但引入了一个额外的数据库查询,看起来毫无意义和低效,因为我有authenticatedUser的用户对象:

User authenticatedUser = HttpContext.Items.TryGetValue("authenticatedUser" ...)   
User user = _usersRepository.GetUserById(authenticatedUser.Id);  
user.Username = "John Doe";  
_usersRepository.SaveChanges();  

如何保存对authenticatedUser所做的更改,而无需再次从我的数据库中提取?

1 个答案:

答案 0 :(得分:3)

我认为你要找的是Attach

User authenticatedUser = HttpContext.Items.TryGetValue("authenticatedUser" ...)   
if(authenticatedUser != null)
{
    _usersRepository.Attach(authenticatedUser);  
    authenticatedUser.Username = "John Doe";  
    _usersRepository.SaveChanges(); 
}