2013-01-16 154 views
0

我一直在我的项目中使用实体框架(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

在那里,你选择要支付不同的分期付款。然后,你介绍一下你在“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(); 
    } 

创建只有一个为各种形式的全球数据库,我创建一个在每个表单的主菜单。然后,在这种形式的封闭事件中,我处理该对象上下文。 然后,当我选中该复选框形象,打造“金”之前,我从对象上下文删除每一个“帕”实体:

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

Lista_nuevos_pagos.Clear(); 

这样做可以正常工作,但I'm仍然有一些麻烦其他创建的实体(分期付款)在清除清单时不会被删除。我认为我错了,这就是为什么我需要一些方向正确使用EF。我真的需要尽快完成这项工作,我没有太多时间阅读EF教程。

以防万一,我这是怎么创建的每一个“帕”(支付)

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

哇!这是一个很好的形式。你用这个控制表的列表“Fecha de vencimineto”吗? – Blocked

+0

谢谢,实际上它是一个带有自定义绘画事件的DataGridView。我还没有使用任何第三方控制。 – Andres

回答

1

我想你有Lista_nuevos_pagos列表中的那些对象的引用。这就是为什么他们会被复制。

+0

我解决了它。而不是做db.delete(p)我做分离。每个创建的实体对象都附加到上下文。这就是为什么它仍然保存临时对象。 – Andres

+0

除了丢弃上下文之外,没有一种很好的方法来移除由上下文跟踪的实体。理想情况下,你不应该保持相同的上下文实例。 – Pawel

+0

是的。这就是我现在所做的。谢谢.. – Andres