无法使用Entity Framework和LINQ

时间:2015-07-22 07:59:22

标签: c# linq entity-framework

我有一个数据库表,我试图用money数据类型(十进制)更新一个单元格,并且我使用LINQ和Entity Framework。

不幸的是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;
     }             
}

3 个答案:

答案 0 :(得分:2)

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

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

这应该有用。

答案 1 :(得分: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;
     }             
}

答案 2 :(得分:1)

这里有几个问题:

最重要的是,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列表中的最后一个值,而不是该列表内容的某种累积,这将是所需的行为所暗示的首先是那里的循环。