不能使用实体框架和LINQ更新我的数据库表

本文关键字:更新 我的 数据库 LINQ 实体 框架 不能 | 更新日期: 2023-09-27 18:04:10

我有一个数据库表,我试图用货币数据类型(十进制)更新一个单元格,我使用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;
     }             
}

不能使用实体框架和LINQ更新我的数据库表

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

db.Entry (obj)。状态= System.Data.Entity.EntityState.Modified;

db.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;
}

此循环将使typeamt设置为ExistingCashPayment列表中的最后一个值,而不是该列表中内容的某种累积,这将是首先在那里进行循环所隐含的期望行为。

当您创建新实体时,必须在调用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;
     }             
}
相关文章: