The error "Entity object cannot reference multiple instances of IEntityChangeTracker"

friends. I really need your help. I would be very grateful.

And so I have the field "Model" c "ID_model" and "name" in MS SQL Server. I want that after clicking "Change" in Form1 another form appears (FormModel), where you can change the data and write the changes to the database.

The problem is that after clicking “Edit” the error message “Additional information: the object of the object cannot refer to multiple instances of IEntityChangeTracker” appears and I don’t know how to fix it.

enter image description here

Code from form 1:

public partial class Form1 : Form
{
    MyDBEntities db2;
    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        db2 = new MyDBEntities();
        modelBindingSource.DataSource = db2.Models.ToList();
        dataGridView.Columns.RemoveAt(2);
    }

    private void btnEdit_Click(object sender, EventArgs e)
    {
        if (modelBindingSource.Current == null)
            return;
        using (FormModel frm = new FormModel(modelBindingSource.Current as Model))
        {
            if (frm.ShowDialog() == DialogResult.OK)
            {
                modelBindingSource.DataSource = db2.Models.ToList();
            }
        }
    }
}

Code from FormModel:

public partial class FormModel : Form
{
    MyDBEntities db2;
    public FormModel(Model obj)
    {
        InitializeComponent();


        db2 = new MyDBEntities();
        if (obj == null)
        {
            modelBindingSource.DataSource = new Model();
            db2.Models.Add(modelBindingSource.Current as Model);
        }
        else
        {
            modelBindingSource.DataSource = obj;
            db2.Models.Attach(modelBindingSource.Current as Model);
        }
    }

    private void FormModel_FormClosing(object sender, FormClosingEventArgs e)
    {
        if (DialogResult == DialogResult.OK)
        {
            if (string.IsNullOrEmpty(txtModelName.Text))
            {
                MessageBox.Show("There are empty fields", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Information);
                txtModelName.Focus();
                e.Cancel = true;
                return;
            }
            db2.SaveChanges();
            e.Cancel = false;
        }
        e.Cancel = false;
    }
}

I really hope for help. All the best. And excuse me for my English.

+4
1

Form1 ( , ):

public partial class Form1 : Form
{
    // code...
    private void Form1_Load(object sender, EventArgs e)
    {
        // code...
        modelBindingSource.DataSource = db2.Models.ToList();
        // code...
    }

    private void btnEdit_Click(object sender, EventArgs e)
    {
        // code...
        using (FormModel frm = new FormModel(modelBindingSource.Current as Model))
        {
            // code...
        }
    }
}

modelBindingSource.DataSource = db2.Models.ToList(); DataSource Models. Models ; , db2 Models. db2, .

using (FormModel frm = new FormModel(modelBindingSource.Current as Model)) Model FormModel.

FormModel :

public partial class FormModel : Form
{
    MyDBEntities db2;
    public FormModel(Model obj)
    {
        db2 = new MyDBEntities();
        // code...
        db2.Models.Attach(modelBindingSource.Current as Model);
    }

    // code...
}

Model db2, Model db2 Form1, , :

IEntityChangeTracker

, .


Fix

db2.Models.Attach(modelBindingSource.Current as Model);, . , . . , Attach.


, , obj in FormModel , , FormModel:

public partial class FormModel : Form
{
    public FormModel(Model obj)
    {
        InitializeComponent();

        modelBindingSource.DataSource = obj;
    }

    private void FormModel_FormClosing(object sender, FormClosingEventArgs e)
    {
        if (DialogResult == DialogResult.OK)
        {
            if (string.IsNullOrEmpty(txtModelName.Text))
            {
                MessageBox.Show("  ", "", MessageBoxButtons.OK, MessageBoxIcon.Information);
                txtModelName.Focus();
                e.Cancel = true;
                return;
            }
        }
    }
}

SaveChanges Form1 :

using (FormModel frm = new FormModel(modelBindingSource.Current as Model))
{
    if (frm.ShowDialog() == DialogResult.OK)
    {
        modelBindingSource.DataSource = db2.Models.ToList(); // not sure if you need this
        db2.SaveChanges(); // <-- call save here since the dialog has been closed.
    }
}

FormModel Form1 . . , OrderEntryForm, OrderDetailForm .. .

+1

Source: https://habr.com/ru/post/1677095/


All Articles