【问题标题】:How to Update/Edit multiple records using Entity Framework in ASP.NET MVC如何在 ASP.NET MVC 中使用实体框架更新/编辑多条记录
【发布时间】:2015-09-10 20:47:17
【问题描述】:

我需要更新多条记录,这就是我能做到的程度

首先,我尝试了这个

foreach (var Product in Products)
{
     Product.Price = Price;

     db.Entry(Product).State = EntityState.Modified;
     db.SaveChanges();
 }

但是,我收到了这个错误

存储更新、插入或删除语句影响了意外数量的行 (0)。自加载实体后,实体可能已被修改或删除。刷新 ObjectStateManager 条目。

然后,我找到this 的答案,说我应该为每次迭代创建新实例,但我得到了同样的错误。以下是我的尝试。

foreach (var Product in Products)
{
     var ProductInLoop = new Product();
     ProductInLoop.Price = Product.Price;

     db.Entry(ProductInLoop).State = EntityState.Modified;
     db.SaveChanges();
 }

我也不能在循环外这样做db.Entry(Products).State = EntityState.Modified;,因为Entry() 需要一个单独的对象。

我该如何解决这个问题?

【问题讨论】:

  • 你为什么循环通过Products却重复设置ProductSizeProductInLoop的值并忽略循环变量Product
  • 你为什么要在你的循环中创建新的Products?你想更新现有的,对吧?
  • 谢谢@BenRobinson,问题就像你说的那样,它是主键= 0,谢谢你我解决了。关于ProductSize,我实际上是在更新ProductSize,而不是Product,但我删除了所有不相关的代码,试图简化/专注于问题,但我忘了改。
  • 请在循环外调用 savechanges 只调用一次

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


【解决方案1】:

感谢 Ben Robinson 的评论,我解决了这个问题。问题是因为我没有将 View 中的 主键 传递给 Controller

视图中,我添加了这个隐藏字段来传递主键,如下所示:

<input type="hidden" name="[@i].id" value="@Product.id" />

服务器端代码如下所示

foreach (var product in Products)
{
    product.Price = Price;

    db.Entry(product).State = EntityState.Modified;
 }
 db.SaveChanges();

【讨论】:

    【解决方案2】:

    无需创建新的 Product 对象。由于您正在修改记录,因此您的 Products 集合可能已经附加到数据库上下文中,并且如果您修改它,它将被跟踪它的状态。

    试试这个:

    foreach (var Product in Products)
    {        
         Product.price = ProductSize.price;
         db.SaveChanges();
    }
    

    如果产品未附加到上下文 (db),请在保存前添加此行:

    db.Products.Attach(Product); 
    

    按照惯例,您还应该将循环变量从 Prodcut 更改为小写形式:product

    【讨论】:

    • 感谢 Ben Robinson 的评论,我解决了这个问题。我没有将主键从视图传递到控制器,它等于零,这导致了错误。一旦我通过它,问题就解决了。也感谢大会的建议。
    猜你喜欢
    • 2018-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-31
    • 1970-01-01
    • 1970-01-01
    • 2019-04-21
    • 1970-01-01
    相关资源
    最近更新 更多