私は自分のプロジェクトでEntityFramework(VS2010 Framework 4.0)を使用しています。フォームごとに異なるオブジェクトコンテキストを使用する際に問題が発生しました。次に、メインメニューフォーム(開いたまま)でオブジェクトコンテキストを作成し、1つのフォームを作成して表示するたびに、そのオブジェクトコンテキストをこの新しいフォームに渡します。例:
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();
}
}
さて、これまではオブジェクトを使用して渡す必要があり、異なるフォームをスローする必要があったため、そのソリューションは正常に機能しました。オブジェクトのコンテキストが異なる場合は、エラーが発生しました。
今、私はそれをこのように使用することで大きな問題を検出しました。ローンのさまざまな分割払いを支払うことができるフォームがあります。画像を添付して、私が話していることを確認できるようにします。
そこで、支払いたいさまざまな分割払いを選択します。次に、「トータルコブラド」で最終的に支払う金額を紹介します。重要なことは次のとおりです。チェックボックスの画像がチェックされている場合(青い画像-すでに画像でチェックされています)、分割払いごとに「支払い」エンティティを作成します。すべての「支払い」オブジェクトはリストに保存されます。チェックを外すと値を変更でき、同じことができます。明らかに、私はを行う前にリストをクリアしてい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();
}
すべてのフォームに対して1つのグローバルデータベースを作成する代わりに、すべてのフォームに対してメインメニューに1つ作成します。次に、その形式のclosedイベントで、そのオブジェクトコンテキストを破棄します。次に、チェックボックスの画像をオンにすると、「支払い」を作成する前に、オブジェクトコンテキストからすべての「Pago」エンティティを削除します。
foreach (Pago p in Lista_nuevos_pagos)
{
db.DeleteObject(p);
}
Lista_nuevos_pagos.Clear();
これを行うと正しく機能しますが、リストをクリアしても削除されない他の作成済みエンティティ(分割払い)で問題が発生します。私はそれを間違ってやっていると思います、それで私は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);
読んでいただきありがとうございます、私はこれがたくさんの情報であることを知っています。すぐにいくつかのガイドを願っています。