Контекст объекта 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. Вот почему они будут продублированы.

Другие вопросы по тегам