不能使用实体框架和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;
}
}
看起来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;
}
此循环将使type
和amt
设置为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;
}
}