Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无法使用实体框架和LINQ更新我的db表_C#_Linq_Entity Framework - Fatal编程技术网

C# 无法使用实体框架和LINQ更新我的db表

C# 无法使用实体框架和LINQ更新我的db表,c#,linq,entity-framework,C#,Linq,Entity Framework,我有一个数据库表,我试图用money数据类型decimal更新一个单元格,我使用LINQ和Entity框架 不幸的是,上下文改变;因为某种原因,它不起作用 这是表格结构 Type Amount Machine Cash 1000 Tablet 这是我的密码: using (var GC = new GroundCommanderEntities()) { PAYMENT_Repo PAYMENTREPO = new PAYMENT_Repo(); var Existing

我有一个数据库表,我试图用money数据类型decimal更新一个单元格,我使用LINQ和Entity框架

不幸的是,上下文改变;因为某种原因,它不起作用

这是表格结构

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;
     }             
}
当您像这样创建新实体时,必须在调用SaveChanges之前将其添加到上下文中:

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


这里有几个问题:

最重要的是,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;
}

此循环将把type和amt设置为现有CashPayment列表中的最后一个值,而不是该列表内容的某种累加,这将是将循环放在那里所隐含的期望行为。

这里有几个问题:

最重要的是,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;
}

此循环将把type和amt设置为现有cashpayment列表中的最后一个值,而不是该列表内容的某种累积,这将是将循环放在那里所隐含的期望行为。

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

db.Entryobj.State=System.Data.Entity.EntityState.Modified; db.SaveChanges


这应该是可行的。

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

db.Entryobj.State=System.Data.Entity.EntityState.Modified; db.SaveChanges


这应该行。

你有错误吗?@MickyDuncan没有。调试时,进入GC.SaveChanges;看看表,它没有应用更改。你知道在你的foreach中你一直在写amt和type的旧值吗?这就是我知道的任何评论之前的问题吗immutable@JamieRees我有一个foreach循环,因为我在列表中有现有的cashpayment。如果表为空,我无法遍历if语句。它正在查找包含现金类型的现有行。你有什么建议?我的意思是你每次都在循环中覆盖amt的值并键入。你真的应该输入amt并输入一个集合。你有错误吗?@MickyDuncan没有。调试时,进入GC.SaveChanges;看看表,它没有应用更改。你知道在你的foreach中你一直在写amt和type的旧值吗?这就是我知道的任何评论之前的问题吗immutable@JamieRees我有一个foreach循环,因为我在列表中有现有的cashpayment。如果表为空,我无法遍历if语句。它正在查找包含现金类型的现有行。你有什么建议?我的意思是你每次都在循环中覆盖amt的值并键入。真的,你应该生成amt并键入一个集合。我有另一个函数来进行添加。到付款回购表。我不需要再添加一行,而是在表中已有行时添加金额。@JoshuaMasangcay:在这种情况下,您必须先从上下文中加载现有行,然后再更新它!然后在应用更改后调用.SaveChanges。我有另一个函数来执行添加操作。到付款回购表。我不需要再添加一行,而是在表中已有行时添加金额。@JoshuaMasangcay:在这种情况下,您必须先从上下文中加载现有行,然后再更新它!然后在应用更改后调用.SaveChanges