我已陷入困境。
我在这里加载用户from
自定义function
:
public User GetUserById(int Id)
{
var User = DBContext.Users.SingleOrDefault(x=>x.Id == Id);
return User;
}
问题出在controller
,我称之为!
var User = GetUserById(Id);
User.Language = UserModel.Language;
//UpdateModel(User); //I tried this but not working.
DBContext.SaveChanges();
数据库未更新。
我尝试用linq直接在控制器中加载用户,事情就好了。
但是,为什么它不起作用?
是否有任何解决方法可以使其与此功能一起使用?
是否有像DBContext.Users.Update(User)
这样的功能。我记得使用类似的东西,但我无法回想起来!
答案 0 :(得分:2)
正如EBrown所说,他们需要是DbContext的同一个实例。我打赌您的服务使用一个上下文而控制器使用另一个上下文。因此,当它到达控制器时,它将被断开连接而不被EF跟踪。
解决方案是将其重新连接到控制器使用的上下文(还有其他方法可以实现此目的)。
var User = GetUserById(Id); // returns a disconnected user
User.Language = UserModel.Language;
// Attach back to context and tell EF it is updated
DBContext.Users.Attach(User);
DBContext.Entity(User).State=EntityState.Modified;
DBContext.SaveChanges();
如果这是你的回发代码,你也可以写一个UserUpdate
函数:
public void UpdateUser(UserModel userViewModel)
{
var userEntity = DBContext.Users.Find(userViewModel.Id); // Get your user from database
Mapper.Map(userViewModel, userEntity); // Use Automapper to move the changed fields into your entity
DbContext.SaveChanges();
}
然后您的控制器POST就是:
if (ModelState.IsValid)
{
UpdateUser(UserModel);
// redirect to list or where ever...
}