2017-05-13 62 views
4

朋友。 我真的需要你的帮助。我会很感激。错误“一个实体对象不能被多个IEntityChangeTracker实例引用”

所以我在MS SQL Server中有实体“模型”c字段“ID_model”和“名称”。 我想要在Form1上单击“编辑”后,还有另一种形式(FormModel),您可以在其中更改数据并将更改写入数据库。

问题是,按下“编辑”后有一个关于“其他信息:一个实体对象不能被多个IEntityChangeTracker实例引用”的错误,我不知道如何解决它。从Form1中

enter image description here

代码:

从FormModel
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(); 
      } 
     } 
    } 
} 

代码:

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个上下文,这是不允许的。这是你如何得到错误。请参阅[this](http://stackoverflow.com/questions/10191734/entity-object-cannot-be-referenced-by-multiple-instances-of-ientitychangetracker)以获取更多信息。 – CodingYoshi

+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))发送ModelFormModel的构造函数。

然后在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新的环境,但由于ModelForm1已连接到db2,例外情况是抛出这显然是在告诉你这一点:

一个实体对象不能被IEntityChangeTracker

的多个实例引用

消息不可能比这更清晰。


修复

删除此行的代码db2.Models.Attach(modelBindingSource.Current as Model);所以你不重视它。不知道你为什么这样做。请参阅this回答为什么以及何时需要致电Attach


清理

其实从您发布,在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. 
    } 
} 

其他注意事项

只是最后要注意,FormModelForm1不是为形式的好名字。表单的好名字应显示表单的意图。例如,像OrderEntryFormOrderDetailForm等名称是好名字。

相关问题