2017-05-13 58 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等名稱是好名字。

相關問題