Asp.net mvc 无法使用实体框架更新数据

Asp.net mvc 无法使用实体框架更新数据,asp.net-mvc,entity-framework,Asp.net Mvc,Entity Framework,我有以下代码。因为我正在尝试更新我的数据。但我收到了错误信息: EntityFramework.dll中发生“System.InvalidOperationException”类型的异常,但未在用户代码中处理 其他信息:ObjectStateManager中已存在具有相同密钥的对象。ObjectStateManager无法跟踪具有相同密钥的多个对象 这是我的密码: [HttpPost] [ValidateAntiForgeryToken] public ActionRes

我有以下代码。因为我正在尝试更新我的数据。但我收到了错误信息:

EntityFramework.dll中发生“System.InvalidOperationException”类型的异常,但未在用户代码中处理

其他信息:ObjectStateManager中已存在具有相同密钥的对象。ObjectStateManager无法跟踪具有相同密钥的多个对象

这是我的密码:

    [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对象设置公司属性(反之亦然,不像现在这样)
  • 保存公司对象
  • 请在下面找到示例代码。 还请注意,最佳实践不是在UI层中使用持久性实体模型,而是使用最少的必填字段集定义一个持久性实体模型,然后手动或使用将其映射到实体


    这是因为您使用的是公司主控的两个对象实例,实际上是具有相同ID的单个实体

    一个(companyMaster)通过绑定作为Edit方法的参数

    通过db.CompanyMasters by ID从数据库中选择的另一个(公司)

    你能做的就是

  • 按ID选择公司,就像现在一样
  • 从companyMaster对象设置公司属性(反之亦然,不像现在这样)
  • 保存公司对象
  • 请在下面找到示例代码。 还请注意,最佳实践不是在UI层中使用持久性实体模型,而是使用最少的必填字段集定义一个持久性实体模型,然后手动或使用将其映射到实体


    谢谢我明白你的意思,但我有一个疑问。我想从数据库中获取名称字段值。那我该怎么处理呢?@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);
        }