朋友。 我真的需要你的帮助。我将非常感激。
所以我在MS SQL Server中有实体“Model”c字段“ID_model”和“name”。 我想在Form1上单击“编辑”后,还有另一个表单(FormModel),您可以在其中更改数据并将更改写入数据库。
问题是在按下“编辑”后出现“附加信息:IEntityChangeTracker的多个实例无法引用实体对象”的错误。我不知道如何修复它。
Form1的代码:
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;
}
}
我真的希望有所帮助。祝一切顺利。请原谅我的英语。
答案 0 :(得分: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的多个实例
无法引用实体对象
消息不能比那更清楚。
<强>修正强>
删除此行代码db2.Models.Attach(modelBindingSource.Current as Model);
,这样您就不会附加它。不知道你为什么这样做。请参阅this答案,了解为何以及何时需要致电Attach
。
清理
实际上,根据您发布的代码,obj
构造函数中的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
等名称就是好名字。