2015-07-22 58 views
1

我有一个数据库表,我想用钱数据类型(十进制)更新单元格,我使用LINQ和实体框架。无法更新我的数据库表使用实体框架和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; 
    }    
} 
+0

你有错误吗? – MickyD

+0

@MickyDuncan不,它不。当我调试时,进入'GC.SaveChanges();'并查看表格,它不应用更改。 –

+0

在“foreach”中你确实知道,你一直在写'amt'和'type'的旧值吗?是这样的问题(在任何评论之前,我知道字符串是不可改变的) –

回答

1

这里有几个问题:

最重要的是,PAYMENTREPO是一个新实例 - 它不是来自数据库上下文,所以更改它的值没有任何影响。您需要保存更改之前添加:

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列表中的最后一个值,而不是某种形式的该列表内容的累积,这将成为首先让循环出现的所需行为。

1

当你创建一个新实体像你这样做,你必须前添加它的上下文致电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; 
    }    
} 
+0

我有另一个功能,添加。到PAYMENT_Repo表。我不需要添加另一行,而是在表中存在时添加金额。 –

+0

@JoshuaMasangcay:在这种情况下,您必须首先从上下文中加载**(获取)现有行 - 在更新之前!然后在应用更改后调用'.SaveChanges()' –

2

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

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

这应该工作。