实体框架对象上下文保存未添加的新实体

时间:2013-01-16 23:46:02

标签: c# winforms entity-framework objectcontext

我一直在我的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();
    }
}

好的,该解决方案到目前为止工作正常,因为我需要使用并传递对象有时会抛出不同的形式,如果对象上下文不同,我就会出错。

现在,我已经通过这种方式发现了一个巨大的问题。我有一张表格,我可以在那里支付不同的贷款分期付款。我会附上一张图片,然后你可以看到我在说什么。

enter image description here

在那里,您可以选择要支付的不同分期付款。然后,您将介绍您将在“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);

感谢您的阅读,我知道这是很多信息。希望一些指导很快..

1 个答案:

答案 0 :(得分:1)

我猜你在Lista_nuevos_pagos列表中有对这些对象的引用。这就是为什么它们会被复制的原因。