2015-07-22 35 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();

這應該工作。

相關問題