我想使用实体框架更改所有对象属性。
在搜索之后我得拥有这个:
控制器,动作:
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());
}
答案 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");
}
我还认为使用一些依赖注入框架对你有好处。所以去吧!!