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