gpt4 book ai didi

c# - ObjectStateManager 无法使用相同的键跟踪多个对象

转载 作者:行者123 更新时间:2023-11-30 17:07:04 25 4
gpt4 key购买 nike

我知道已经有人问过很多像这样的问题,但我似乎无法理解哪里出了问题。这是我的代码:

[HttpGet]
public ViewResult Edit(int id)
{
User user = userRepository.GetAll().FirstOrDefault(x => x.ID == id);

return View("Edit", user);
}

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(User user)
{
if (ModelState.IsValid)
{
user.Password = HashHelper.GetHash(user.Password);
if (user.ID == 0) // new user
{
User testUser = userRepository.GetAll().FirstOrDefault(x => x.Name.Equals(user.Name));

if (testUser == null)
userRepository.AddEntity(user);
else
{
ModelState.AddModelError("", "Deze gebruikersnaam bestaat al");
return View(user);
}
}
else // edit existing user
{
User tempUser = userRepository.GetAll().First(x => x.ID == user.ID);

if (!user.Name.Equals(tempUser.Name))
{
// naam werd aangepast
int count = userRepository.GetAll().Count(x => x.Name.Equals(user.Name));

if (count > 0)
{
ModelState.AddModelError("", "Deze gebruikersnaam bestaat al");
return View(user);
}

}

userRepository.UpdateEntity(user);

}
userRepository.SaveChanges();
return RedirectToAction("Index");
}
else
{
return View(user);
}
}

更新实体:

public void UpdateEntity(T entity)
{
var entry = context.Entry(entity);
if (entry.State == EntityState.Detached)
context.Set<T>().Attach(entity);

context.Entry<T>(entity).State = EntityState.Modified;
}

这会导致此错误:

An object with the same key already exists in the ObjectStateManager. The ObjectStateManager cannot track multiple objects with the same key

我不明白。为什么这不起作用,我该如何解决?

最佳答案

有多个问题;

  • 如果要获取单个实体,请不要调用 GetAll(),如果数据库中有数千个实体怎么办。只需在存储库中实现 SingleOrDefault。

使用:

用户 testUser = userRepository.FirstOrDefault(x => x.Name.Equals(user.Name));

代替:

User testUser = userRepository.GetAll().FirstOrDefault(x => x.Name.Equals(user.Name));
  • 从数据库中获取现有用户后,只需使用新值更新此项,而不是尝试保留从页面返回的值;

使用

User tempUser = userRepository.GetAll().First(x => x.ID == user.ID);
tempUser.UserName = user.UserName;
....
SaveChanges();

而不是试图持久化从页面检索到的用户。

  • 您需要确定实体的 key ;是名称、ID 还是两者兼有。

关于c# - ObjectStateManager 无法使用相同的键跟踪多个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14849202/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com