为什么我的代码会触发多个数据库上下文,尽管我只使用了1个上下文

时间:2017-03-25 03:13:25

标签: c# asp.net entity-framework

很抱歉,如果代码有点长。我只有一个背景。但是我收到以下错误

  

IEntityChangeTracker的多个实例无法引用实体对象。

以下是触发它的行

  

第163行:foreach(SessionVariables.ligneNouvelleFacture中的ligne l)

     

第164行:{

     

第165行:dc.ligne.Add(l);

     

第166行:}

所以我只想尝试使用EntityFramework上下文类默认方法在数据库中插入数据。数据存储在一个静态的对象列表中,我使用foreach进行迭代,然后在上下文中添加,然后保存更改dc.SaveChanges()

我不知道为什么会出现这个错误,因为我只在代码后面的webform中创建了一个上下文实例。并且相同的上下文变量用于在页面加载时填充gridview。

你可以帮我解决一下吗?以下是我的代码

public class Utilities()
{
   public static list<object> myList = new list<object>();
}

public partial classe MyWebform : Page
{
   MyContext cnx = new MyContext();
   potected void Page_Load()
   { // Do something with the context "cnx" and static list of utilities class}

protected void button_Click(...)
{
   //Also do something with the context "cnx" and the static list of utilities class
}
}

更新

在下面的anwser之后以及在MSDN上看到Dispose并阅读Entity Framework and context dispose之后,我尝试了一种似乎有效的新方法。希望它不是太糟糕。我可能错误地实现了using,但它似乎没有隐含dispose

public class  MyWebForm .....
{
  // I do no declare a context variable object so that every time a context must be used, I do the following.

  using (MyContext cnx = new MyContext())
  {
     // ...do something with cnx
     cnx.Dispose();  // This line appears to be compulsory to avoid multiple context error
  }
}

希望这有助于某人

1 个答案:

答案 0 :(得分:0)

您正在创建多个上下文。每次加载页面时都会创建一个新页面。您保留一个静态的对象列表,然后尝试将它们一次又一次地添加到上下文中,即使它们已经在一个上下文中。这将导致错误。

这也可能导致内存泄漏,因为每个对象都有一个单独的上下文,由于对象处于活动状态而无法释放。您应该重新设计功能。是否有必要将对象保留在内存中?为什么需要再次将所有对象添加到上下文中而不仅仅是新对象?