我一直在我的proyect中使用Entity Framework(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);
感谢您的阅读,我知道这是很多信息。希望一些指导很快..
答案 0 :(得分:1)
我猜你在Lista_nuevos_pagos列表中有对这些对象的引用。这就是为什么它们会被复制的原因。