0

I have been working with Entity Framework (VS2010 Framework 4.0) in my proyect. I had some trouble with using a different object context per form. What I did then, was to create a object context in the Main Menu Form (stays opened) and everytime I create and show one form, I pass that object context to this new form. Example:

 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();
    }
}

Ok, that solution worked fine until now because I needed to use and pass objects throw the differents forms sometimes, and if the objects contexts were different, I got an error.

Now, I have detected a huge issue using it this way. I have a form, where I can pay for the different installments of a loan. I´ll attach an image so then you can see what I´m talking about.

enter image description here

There, you select the different installments you want to pay for. Then, you introduce the value you will finally pay in "Total cobrado". Here is the important thing: When the checkbox image is checked (the blue one - already checked in the image), I create a "payment" entity per installment. Every "payment" object is stored in a list. If I uncheck it, I can change the value and the same thing is done. Obviously, I´m clearing the list before doing a list.Clear();. Then, one the checkbox checked, I can press "Aceptar" (accept). There I add to the database every "payment"(PAGO) in the list. After that, I save all changes.

foreach (Pago p in Lista_nuevos_pagos)
{
    db.AddToPago(p);
}
try
{
    db.SaveChanges();
    this.Close();
}

My problem, is that it´s not only adding those "payments" in the list but the other "payments" entities that were in the list before clearing it. I reach the conclusion that when I clear the list, the objects remains in the object context. I thought that if the entity is not in the database, I have to Add it to the entity in the object context as I did with pago (db.AddToPago(p);).

I wanted to ask you guys how can I solve this issues. I solved it now doing this:

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();
    }

Instead of creating just one global db for all forms, I create one in the Main Menu for every form. Then, in that form closed event, I dispose that object context. Then, when i check the checkbox image, before creating the "payments", I delete every "Pago" entity from the object context:

foreach (Pago p in Lista_nuevos_pagos)
        {
            db.DeleteObject(p);
        }

Lista_nuevos_pagos.Clear();

Doing this works correctly, but I´m still having trouble with some other created entities (Installments) that are not deleted when I clear a list. I think I´m doing it wrongly, thats why I need some direction to use EF correctly. I really need to get this done really soon, I don´t have too much time to read EF tutorials.

Just in case, this is how I create every "Pago" (payment)

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);

Thank you for reading, I know this is a lot of info. Hope some guide soon..

Andres
  • 2,729
  • 5
  • 29
  • 60
  • Wow!This is a nice form.What controls do you used for this table with column "Fecha de vencimineto"? – Blocked Apr 19 '13 at 12:00
  • Thanks, actually its a DataGridView with custom paint events. I havent used any third party control. – Andres Apr 19 '13 at 21:45

1 Answers1

1

I guess that you have references to those object in your Lista_nuevos_pagos list. This is why they will be duplicated.

Chatumbabub
  • 1,557
  • 2
  • 18
  • 30
  • I worked it out. Instead of doing the db.delete(p) I do detach. Every created entity object is attached to the context. Thats why it was still saving temporary objects. – Andres Jan 18 '13 at 03:53
  • There isn't a good way to remove entities tracked by the context aside from throwing away the context. Ideally you should not keep the same context instance around. – Pawel Jan 18 '13 at 05:06