【问题标题】:Can't update my db table using Entity Framework and LINQ无法使用实体框架和 LINQ 更新我的数据库表
【发布时间】:2015-07-22 16:17:15
【问题描述】:

我有一个数据库表,我正在尝试使用货币数据类型(十进制)更新一个单元格,并且我正在使用 LINQ 和实体框架。

很遗憾,Context.SaveChanges(); 由于某种原因无法正常工作。

这是表结构

Type Amount Machine
Cash 1000   Tablet

这是我的代码:

using (var GC = new GroundCommanderEntities())
{
    PAYMENT_Repo PAYMENTREPO = new PAYMENT_Repo(); 
    var ExistingCashPayment = GC.PAYMENT_Repo
        .Where(Filter => Filter.Type == "Cash" && Filter.Machine == "Tablet").ToList();

    string type = "";
    var amt = 0.00m;

    foreach (var item in ExistingCashPayment)
    {
        type = item.Type;
        amt = item.Amount;
    }

    if (type == cbPaymentType.Text) //a combobox that contains Types 
    {
        PAYMENTREPO.Amount = amt + Convert.ToDecimal(txtTendering.Text);                    
        GC.SaveChanges();

        return true;
     }
     else
     {
         return false;
     }             
}

【问题讨论】:

  • 你收到错误了吗?
  • @MickyDuncan 不,它没有。当我调试时,进入GC.SaveChanges(); 并查看表格,它没有应用更改。
  • 您知道在您的foreach 中您一直在重写amttype 的旧值吗?是这个问题吗(在任何人之前我都知道字符串是不可变的)
  • @JamieRees 我有一个 foreach 循环,因为我在列表中有 ExistingCashPayment。如果表为空,我无法通过 if 语句。它正在寻找其中包含 Cash 类型的现有行。你有什么建议?
  • 我的意思是你在循环中每次都覆盖amttype 的值。你真的应该把amttype 收藏起来。

标签: c# linq entity-framework


【解决方案1】:

看起来 GC 是你的 DbContext。如果是这样就需要添加对象的状态修改如下...

db.Entry(obj).State = System.Data.Entity.EntityState.Modified; db.SaveChanges();

这应该可行。

【讨论】:

    【解决方案2】:

    这里有几个问题:

    最重要的是,PAYMENTREPO 是一个新实例 - 它不是来自 db 上下文,因此更改它的值没有效果。您需要在保存更改之前添加它:

    PAYMENTREPO.Amount = amt + Convert.ToDecimal(txtTendering.Text);                    
    GC.PAYMENTREPOs.Add(PAYMENTREPO);
    GC.SaveChanges();
    

    第二个,不会导致完全更新失败,但会导致代码做你不希望的事情:

    foreach (var item in ExistingCashPayment)
    {
        type = item.Type;
        amt = item.Amount;
    }
    

    此循环将使 typeamt 设置为 ExistingCashPayment 列表中的最后一个值,而不是对该列表的内容进行某种累积,这将是其中包含循环所暗示的期望行为第一名。

    【讨论】:

      【解决方案3】:

      当您像这样创建新实体时,您必须在调用SaveChanges()之前将其添加到上下文中:

      using (var GC = new GroundCommanderEntities())
      {
          PAYMENT_Repo PAYMENTREPO = new PAYMENT_Repo(); 
          var ExistingCashPayment = GC.PAYMENT_Repo
              .Where(Filter => Filter.Type == "Cash" && Filter.Machine == "Tablet").ToList();
      
          string type = "";
          var amt = 0.00m;
      
          foreach (var item in ExistingCashPayment)
          {
              type = item.Type;
              amt = item.Amount;
          }
      
          if (type == cbPaymentType.Text) //a combobox that contains Types 
          {
              PAYMENTREPO.Amount = amt + Convert.ToDecimal(txtTendering.Text);                    
      
              // add your NEW entity to the context!
              // depending on which exact version of EF you're using, this
              // might be called `.Add()` or `.AddObject()`
              // Also, the name "PAYMENTREPOs" is just a guess - it might be 
              // different in your concrete case - adapt as needed!
              GC.PAYMENTREPOs.Add(PAYMENTREPO);
      
              GC.SaveChanges();
      
              return true;
           }
           else
           {
               return false;
           }             
      }
      

      【讨论】:

      • 我有另一个函数可以添加。到 PAYMENT_Repo 表。我不需要添加另一行,而是在表中存在 Amount 时添加它。
      • @JoshuaMasangcay:在这种情况下,您必须首先从上下文中加载(获取)现有行 - 在更新之前!然后在应用更改后调用.SaveChanges()
      猜你喜欢
      • 1970-01-01
      • 2022-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多