实体更新问题| C#实体框架

时间:2017-05-15 15:38:33

标签: c# entity-framework

我已陷入困境。

我在这里加载用户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)这样的功能。我记得使用类似的东西,但我无法回想起来!

1 个答案:

答案 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...
}