我一直在我的项目中使用实体框架(VS2010 Framework 4.0)。我在为每个表单使用不同的对象上下文时遇到了一些麻烦。我当时所做的是在主菜单表单中创建一个对象上下文(保持打开状态),每次创建并显示一个表单时,我都会将该对象上下文传递给这个新表单。例子:
public partial class frm_Menu : Base
{
public Sistema_financiero_Entities db = new Sistema_financiero_Entities();
private void cancelarCuotaToolStripMenuItem_Click(object sender, EventArgs e)
{
frm_Cancelacion_Cuota Form1 = new frm_Cancelacion_Cuota();
Form1.db = db;
Form1.Show();
}
}
好的,该解决方案直到现在都运行良好,因为我需要使用和传递对象有时会抛出不同的形式,如果对象上下文不同,我就会出错。
现在,我用这种方式发现了一个巨大的问题。我有一个表格,我可以在其中支付贷款的不同分期付款。我会附上一张图片,这样你就可以看到我在说什么。
在那里,您可以选择要支付的不同分期付款。然后,您介绍您最终将在“Total cobrado”中支付的价值。这是重要的事情:当复选框图像被选中时(蓝色的 - 已经在图像中选中),我每期创建一个“付款”实体。每个“支付”对象都存储在一个列表中。如果我取消选中它,我可以更改值并完成同样的事情。显然,我在做list.Clear();
. 然后,选中一个复选框,我可以按“Aceptar”(接受)。在那里,我将列表中的每个“付款”(PAGO)添加到数据库中。之后,我保存所有更改。
foreach (Pago p in Lista_nuevos_pagos)
{
db.AddToPago(p);
}
try
{
db.SaveChanges();
this.Close();
}
我的问题是,它不仅在列表中添加了那些“付款”,而且在清除之前添加了列表中的其他“付款”实体。我得出的结论是,当我清除列表时,对象仍保留在对象上下文中。我认为如果实体不在数据库中,我必须将它添加到对象上下文中的实体中,就像我对 pago ( db.AddToPago(p);
) 所做的那样。
我想问你们我该如何解决这个问题。我现在解决了这个问题:
private void cancelarCuotaToolStripMenuItem_Click(object sender, EventArgs e)
{
Sistema_financiero_Entities db = new Sistema_financiero_Entities();
frm_Cancelacion_Cuota Form1 = new frm_Cancelacion_Cuota();
Form1.db = db;
Form1.Show();
}
我没有为所有表单创建一个全局数据库,而是在主菜单中为每个表单创建一个。然后,在该表单关闭事件中,我处理该对象上下文。然后,当我检查复选框图像时,在创建“付款”之前,我从对象上下文中删除每个“Pago”实体:
foreach (Pago p in Lista_nuevos_pagos)
{
db.DeleteObject(p);
}
Lista_nuevos_pagos.Clear();
这样做可以正常工作,但是当我清除列表时,我仍然遇到一些其他创建的实体(分期付款)没有被删除的问题。我认为我做错了,这就是为什么我需要一些指导才能正确使用 EF。我真的需要尽快完成这项工作,我没有太多时间阅读 EF 教程。
以防万一,这就是我创建每个“Pago”(付款)的方式
Pago p = new Pago();
p.desc_aumento_intereses = nudwb1.Value;
p.desc_aumento_punitorios = nudwb2.Value;
p.desc_aumento_gastos = nudwb3.Value;
p.desc_aumento_comision = nudwb4.Value;
p.cotizacion = ntxt_Cotizacion.Value;
p.fecha_hora = fecha_hora;
Cuota c = new Cuota();
string name = tbx.Name.Substring(tbx.Name.IndexOf("-") + 1);
int nro_cuota = Convert.ToInt32(name);
c = Lista_cuotas_cobrar.Where(x => x.num_cuota == nro_cuota).First();
p.Cuota.Add(c);
感谢您的阅读,我知道这是很多信息。希望尽快有指导..