C# 无法使用实体框架和LINQ更新我的db表
我有一个数据库表,我试图用money数据类型decimal更新一个单元格,我使用LINQ和Entity框架 不幸的是,上下文改变;因为某种原因,它不起作用 这是表格结构C# 无法使用实体框架和LINQ更新我的db表,c#,linq,entity-framework,C#,Linq,Entity Framework,我有一个数据库表,我试图用money数据类型decimal更新一个单元格,我使用LINQ和Entity框架 不幸的是,上下文改变;因为某种原因,它不起作用 这是表格结构 Type Amount Machine Cash 1000 Tablet 这是我的密码: using (var GC = new GroundCommanderEntities()) { PAYMENT_Repo PAYMENTREPO = new PAYMENT_Repo(); var Existing
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;
}
}
当您像这样创建新实体时,必须在调用SaveChanges之前将其添加到上下文中:
当您像这样创建新实体时,必须在调用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设置为现有CashPayment列表中的最后一个值,而不是该列表内容的某种累加,这将是将循环放在那里所隐含的期望行为。这里有几个问题: 最重要的是,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设置为现有cashpayment列表中的最后一个值,而不是该列表内容的某种累积,这将是将循环放在那里所隐含的期望行为。看起来GC就是您的DbContext。如果是这样,您需要添加对象的状态修改如下 db.Entryobj.State=System.Data.Entity.EntityState.Modified; db.SaveChanges
这应该是可行的。看起来GC就是您的DbContext。如果是这样,您需要添加对象的状态修改如下 db.Entryobj.State=System.Data.Entity.EntityState.Modified; db.SaveChanges
这应该行。你有错误吗?@MickyDuncan没有。调试时,进入GC.SaveChanges;看看表,它没有应用更改。你知道在你的foreach中你一直在写amt和type的旧值吗?这就是我知道的任何评论之前的问题吗immutable@JamieRees我有一个foreach循环,因为我在列表中有现有的cashpayment。如果表为空,我无法遍历if语句。它正在查找包含现金类型的现有行。你有什么建议?我的意思是你每次都在循环中覆盖amt的值并键入。你真的应该输入amt并输入一个集合。你有错误吗?@MickyDuncan没有。调试时,进入GC.SaveChanges;看看表,它没有应用更改。你知道在你的foreach中你一直在写amt和type的旧值吗?这就是我知道的任何评论之前的问题吗immutable@JamieRees我有一个foreach循环,因为我在列表中有现有的cashpayment。如果表为空,我无法遍历if语句。它正在查找包含现金类型的现有行。你有什么建议?我的意思是你每次都在循环中覆盖amt的值并键入。真的,你应该生成amt并键入一个集合。我有另一个函数来进行添加。到付款回购表。我不需要再添加一行,而是在表中已有行时添加金额。@JoshuaMasangcay:在这种情况下,您必须先从上下文中加载现有行,然后再更新它!然后在应用更改后调用.SaveChanges。我有另一个函数来执行添加操作。到付款回购表。我不需要再添加一行,而是在表中已有行时添加金额。@JoshuaMasangcay:在这种情况下,您必须先从上下文中加载现有行,然后再更新它!然后在应用更改后调用.SaveChanges