C# “错误”;一个实体对象不能被IEntityChangeTracker的多个实例引用;

C# “错误”;一个实体对象不能被IEntityChangeTracker的多个实例引用;,c#,.net,sql-server,entity-framework,ado.net,C#,.net,Sql Server,Entity Framework,Ado.net,朋友们。 我真的需要你的帮助。我将非常感激 所以我在MS SQL Server中有实体“Model”c字段“ID_Model”和“name”。 我想,在点击Form1上的“编辑”之后,还有另一个表单(FormModel),您可以在其中更改数据并将更改写入数据库 问题是,按下“编辑”键后,出现了一个关于“附加信息:一个实体对象不能被多个IEntityChangeTracker实例引用”的错误,我不知道如何修复它 表格1中的代码: public partial class Form1 : Form

朋友们。 我真的需要你的帮助。我将非常感激

所以我在MS SQL Server中有实体“Model”c字段“ID_Model”和“name”。 我想,在点击Form1上的“编辑”之后,还有另一个表单(FormModel),您可以在其中更改数据并将更改写入数据库

问题是,按下“编辑”键后,出现了一个关于“附加信息:一个实体对象不能被多个IEntityChangeTracker实例引用”的错误,我不知道如何修复它

表格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();
            }
        }
    }
}
来自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;
    }
}

我真的希望能得到帮助。祝你一切顺利。请原谅我的英语。

表格1
中,您有此代码(注意,为了简洁起见,我用注释替换了一些代码):

代码
modelBindingSource.DataSource=db2.Models.ToList()
正在将
数据源
属性设置为
模型
模型中的所有内容都是从数据库加载的;换句话说,
db2
上下文包含
模型中的所有内容。您刚刚从
db2
获得它,所以它一定在那里

代码
使用(FormModel frm=new FormModel(modelBindingSource.Current as Model))
模型
发送给
表单模型
构造函数

然后在
FormModel
中,您有以下代码:

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

    // code...
}
在上面的代码中,您正在将
模型
附加到一个名为
db2
的新上下文,但是由于
模型
已附加到
Form1
中的
db2
,因此会引发异常,它清楚地告诉您:

一个实体对象不能被多个IEntityChangeTracker实例引用

这个信息再清楚不过了


修复

删除这行代码
db2.Models.Attach(modelBindingSource.Current作为模型)所以您没有附加它。不知道你为什么这么做。请参阅答案,了解您需要呼叫
附件的原因和时间


清理

实际上,根据您发布的代码,
FormModel
构造函数中的
obj
永远不能为空,因此这就是
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;
            }
        }
    }
}
然后在
Form1
中调用
SaveChanges
,如下所示:

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 frm=新的FormModel(modelBindingSource.Current作为模型))
{
if(frm.ShowDialog()==DialogResult.OK)
{
modelBindingSource.DataSource=db2.Models.ToList();//不确定是否需要此选项

db2.SaveChanges();//您正在将同一项附加到多个上下文,这是不允许的。这就是您得到错误的原因。请参阅更多信息。感谢您的答复。但我不知道如何解决我的情况。我查看了您的链接,但它对我没有帮助。
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.
    }
}