Asp.net mvc 无法使用实体框架更新数据
我有以下代码。因为我正在尝试更新我的数据。但我收到了错误信息: EntityFramework.dll中发生“System.InvalidOperationException”类型的异常,但未在用户代码中处理 其他信息:ObjectStateManager中已存在具有相同密钥的对象。ObjectStateManager无法跟踪具有相同密钥的多个对象 这是我的密码:Asp.net mvc 无法使用实体框架更新数据,asp.net-mvc,entity-framework,Asp.net Mvc,Entity Framework,我有以下代码。因为我正在尝试更新我的数据。但我收到了错误信息: EntityFramework.dll中发生“System.InvalidOperationException”类型的异常,但未在用户代码中处理 其他信息:ObjectStateManager中已存在具有相同密钥的对象。ObjectStateManager无法跟踪具有相同密钥的多个对象 这是我的密码: [HttpPost] [ValidateAntiForgeryToken] public ActionRes
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit([Bind(Include="CompanyId,Address,EstbalishYear,Email,IsActive")] CompanyMaster companymaster)
{
if (companymaster.CompanyId == 0)
{
return View(companymaster);
}
CompanyMaster company = db.CompanyMasters.SingleOrDefault(x => x.CompanyId == companymaster.CompanyId);
companymaster.Name = company.Name;
companymaster.InsertedBy = company.InsertedBy;
companymaster.InsertedTime = company.InsertedTime;
companymaster.UpdatedBy = 1;
companymaster.UpdatedTime = DateTime.Now;
ModelState.Remove("Name");
if (ModelState.IsValid)
{
db.Entry(companymaster).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
return View(companymaster);
}
请向我解释如何修复此错误消息?这是因为您使用的是公司主服务器的两个对象实例,实际上是一个具有相同ID的单个实体 一个(companyMaster)通过绑定作为Edit方法的参数 通过db.CompanyMasters by ID从数据库中选择的另一个(公司) 你能做的就是
这是因为您使用的是公司主控的两个对象实例,实际上是具有相同ID的单个实体 一个(companyMaster)通过绑定作为Edit方法的参数 通过db.CompanyMasters by ID从数据库中选择的另一个(公司) 你能做的就是
谢谢我明白你的意思,但我有一个疑问。我想从数据库中获取名称字段值。那我该怎么处理呢?@MohitModi,如果你不想覆盖这个名字,就不要设置它。保持数据库中的状态,不要从companyMaster.Name设置company.Name,但如果我没有在操作绑定列表中设置CompanyName。然后显示一个或多个实体验证失败的错误消息。有关详细信息,请参阅“EntityValidationErrors”属性。我不希望用户可以更改公司名称,所以我并没有将该字段包括在绑定列表中。bcz如果我在Bind参数中设置了CompanyName,任何一个bady都可以通过ajax调用更改CompanyName。@MohitModi,您可以将其保留在操作绑定列表中-只是不要在代码中使用它-也就是说,此行不应该出现
company.Name=companyMaster.Name代码>,您可以删除ModelState.remove(“Name”)代码>as wellbut CompanyMaster.Name字段在模型上具有必需的字段验证。那我怎么处理这种情况呢谢谢。我明白你的意思,但我有一个疑问。我想从数据库中获取名称字段值。那我该怎么处理呢?@MohitModi,如果你不想覆盖这个名字,就不要设置它。保持数据库中的状态,不要从companyMaster.Name设置company.Name,但如果我没有在操作绑定列表中设置CompanyName。然后显示一个或多个实体验证失败的错误消息。有关详细信息,请参阅“EntityValidationErrors”属性。我不希望用户可以更改公司名称,所以我并没有将该字段包括在绑定列表中。bcz如果我在Bind参数中设置了CompanyName,任何一个bady都可以通过ajax调用更改CompanyName。@MohitModi,您可以将其保留在操作绑定列表中-只是不要在代码中使用它-也就是说,此行不应该出现company.Name=companyMaster.Name代码>,您可以删除ModelState.remove(“Name”)代码>as wellbut CompanyMaster.Name字段在模型上具有必需的字段验证。那我怎么处理这种情况呢
[HttpPost] [ValidateAntiForgeryToken]
public ActionResult Edit([Bind(Include="CompanyId,Address,EstbalishYear,Email,IsActive")] CompanyMaster companymaster)
{
if (companymaster.CompanyId == 0)
{
return View(companymaster);
}
CompanyMaster company = db.CompanyMasters.SingleOrDefault(x => x.CompanyId == companymaster.CompanyId);
company.Address = companymaster.Address;
company.EstbalishYear= companymaster.EstbalishYear;
company.Email = companymaster.Email;
company.IsActive= companymaster.IsActive;
company.UpdatedBy = 1;
company.UpdatedTime = DateTime.Now;
ModelState.Remove("Name");
if (ModelState.IsValid)
{
db.SaveChanges();
return RedirectToAction("Index");
}
return View(companymaster);
}