2013-01-16 160 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