使用实体框架更新对象的所有字段

时间:2016-07-01 09:21:40

标签: c# asp.net-mvc entity-framework

我想使用实体框架更改所有对象属性。
在搜索之后我得拥有这个:

控制器,动作:

public ActionResult Test()
{
    var user = GetCurrentUser();
    user.FirstName = "BLAH BLAH";
    new UserRepository().UpdateUser(user);
    return RedirectToAction("Index");
}

并在我的UserRepository中:

public bool UpdateUser(ApplicationUser target)
{
     using (var db = new AppDatabase())
     {
        db.Entry(target).State = EntityState.Modified;
        db.SaveChanges();
        return true;
     }
}

但是当我尝试执行时我得到了这个错误

  

实体对象不能被多个EntityChangeTracker实例引用。

那么,有什么方法可以修复或更好的方法吗?
使用实体框架6.0.0和.net 4.5

public ApplicationUser GetCurrentUser()
{
   return UserManager.FindById(User.Identity.GetUserId());
}

2 个答案:

答案 0 :(得分:0)

确保所有对象来自相同的上下文!

var userContextOne = new MyDbContext();
var user = userContextOne.Users.FirstOrDefault();

var AppDbContextTwo = new MyDbContext();

// Warning when you work with entity properties here! Be sure that all objects came from the same context!
db.Entry(target).State = EntityState.Modified;

AppDbContextTwo.SaveChanges();

第二个问题(与例外无关!):

db.Entry(target).State = EntityState.Modified;

你为什么这样做?!你没有Detached Scenario?你有没有禁用你的Changetracker?无论如何只要执行DetectChanges,这个方法就会找到你自己不需要做的改变数据。

答案 1 :(得分:0)

您应该使用相同的db context实例进行查找和更新,因此UserRepository可以是:

 class UserRepository : IDisposable //using IDisposable to dispose db context
 {
      private AppDatabase _context;
      public UserRepository()
      {
           _context = new AppDatabase();
      }

      public ApplicationUser Find(string id)
      {
           return _context.Set<ApplicationUser>().Find(id);
      }

      public void Update(ApplicationUserentity entity)
      {
          _context.Entry(entity).State = EntityState.Modified;
          _context.SaveChanges();
      }

      public void Dispose()
      {
           _context.Dispose();
      }   
 }

您可以在控制器中使用它:

public ActionResult Test()
{
    using (var repository = new UserRepository())
    {
         var user = repository.Find(User.Identity.GetUserId());
         user.FirstName = "BLAH BLAH";
         repository.Update(user);
    }
    return RedirectToAction("Index");
}

我还认为使用一些依赖注入框架对你有好处。所以去吧!!