Контекст объекта Entity Framework сохраняет новые сущности, которые не были добавлены
Я работал с 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();
}
}
Хорошо, это решение работало до сих пор, потому что мне нужно было использовать и передавать объекты, иногда бросать разные формы, и если контексты объектов были другими, я получал ошибку.
Теперь я обнаружил огромную проблему, используя его таким образом. У меня есть форма, в которой я могу оплатить различные платежи по кредиту. Я приложу изображение, чтобы вы могли видеть, о чем я говорю.
Там вы выбираете различные взносы, за которые хотите заплатить. Затем вы вводите значение, которое вы, наконец, заплатите в "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();
}
Вместо того, чтобы создавать только одну глобальную базу данных для всех форм, я создаю ее в главном меню для каждой формы. Затем в закрытом событии этой формы я располагаю контекст этого объекта. Затем, когда я проверяю изображение флажка, перед созданием "платежей" я удаляю каждую сущность "Паго" из контекста объекта:
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);
Спасибо за чтение, я знаю, что это много информации. Надеюсь, какое-нибудь руководство скоро..
1 ответ
Я предполагаю, что у вас есть ссылки на эти объекты в вашем списке Lista_nuevos_pagos. Вот почему они будут продублированы.