Asp.net 应用程序中的实体框架不同上下文异常

Posted

技术标签:

【中文标题】Asp.net 应用程序中的实体框架不同上下文异常【英文标题】:Entity framework different contexts exception within Asp.net application 【发布时间】:2014-05-05 11:31:19 【问题描述】:

我是使用实体框架的新手,我遇到了这个问题:

    List<Metier> listofjobs = new List<Metier>();
    Guid userId;
    WorkEntities notrecontexte;
    Candidat CurrentCandidat;

    protected void Page_Load(object sender, EventArgs e)
    
        userId = new Guid(Membership.GetUser().ProviderUserKey.ToString());
        notrecontexte = new WorkEntities ();
        CurrentCandidat = notrecontexte.Candidat
            .Include("Metier1")
            .Include("Mobilite1")
            .Include("NiveauDuDiplome1")
            .Include("NiveauDuPoste1")
            .Include("Disponibilite_Candidat")
            .Include("Contrats1")
            .First(x => x.UserId.Equals(userId) == true);
    

    protected void btn_Click(object sender, EventArgs e)
    
        listofjobs = (List<Metier>)Session["listofjobs"];
        if (listofjobs != null)
        
            CurrentCandidat.Metier1.Clear();
            try
            
                notrecontexte.SaveChanges();
            
            catch  

            for (int i = 0; i < listofjobs.Count; i++)
            
                CurrentCandidat.Metier1.Add(listofjobs[i]);
                try
                
                    notrecontexte.SaveChanges();
                
                catch  
            
        
    

 protected void Button1_Click(object sender, EventArgs e)
        
            if ((List<Metier>)Session["listofjobs"] != null)
            
             listofjobs = (List<Metier>)Session["listofjobs"];
            
            string newjob = tbAddMetier.Text;
            Metier m = new Metier  Lebelle = newjob ;
            tbAddMetier.Text = "";

            listofjobs.Add(m);
            rptrMetier.DataSource = listofjobs;
            rptrMetier.DataBind();
            C_Compte.Update();

            Session["listofjobs"] = listofjobs;
        

        protected void ImageButton1_Click(object sender, CommandEventArgs e)
        
            if ((List<Metier>)Session["listofjobs"] != null)
            

                listofjobs = (List<Metier>)Session["listofjobs"];
            
            string newjob = e.CommandArgument.ToString().Split(',')[0];
            listofjobs.Remove(listofjobs.Find(x => x.Lebelle == newjob));
            rptrMetier.DataSource = listofjobs;
            rptrMetier.DataBind();
            C_Compte.Update();
            Session["listofjobs"] = listofjobs;
        

我在这些方面有问题:

CurrentCandidat.Metier1.Add(listofjobs[i]);
try

    notrecontexte.SaveChanges();

catch  

当我尝试保存更改时,我得到了这个异常The relationship between the two objects cannot be defined because they are attached to different ObjectContext objects.

    出现此异常的原因是什么? 我该如何解决?

【问题讨论】:

【参考方案1】:

实体框架具有依赖于上下文的行为。如果一个实体属于上下文的一个实例,则不能在另一个上下文实例中使用它,除非您将该实体从第一个上下文中分离并附加到第二个上下文中。

对于您的情况,在将实体列表保存到会话时,您需要先分离列表,然后在按钮单击事件中,您需要将 listofJobs 附加到当前上下文。

我不清楚您的程序流程,但是,如果您可以在每个 listofjobs = (List&lt;Metier&gt;)Session["listofjobs"]; 之后附加列表并在每个 Session["listofjobs"] = listofjobs; 之前分离,那可能会起作用。

您可以查看如何在实体框架中分离和附加对象,您可以使用以下链接: http://msdn.microsoft.com/en-us/library/vstudio/bb896271(v=vs.100).aspx http://msdn.microsoft.com/en-us/library/vstudio/bb896245(v=vs.100).aspx http://msdn.microsoft.com/en-us/library/vstudio/bb738697(v=vs.100).aspx

【讨论】:

但我认为在这种情况下我没有使用 2 个上下文!! 您正在使用 Session 中的作业列表,在每个回发中,您正在创建一个新的上下文实例并在该页面生命周期中使用它。在点击事件中,我猜您正在使用上一个生命周期中的上下文。 请看我的编辑:我怎么能you need to detach the list first, and at the button click event, you need to attach listofJobs to the your current context.

以上是关于Asp.net 应用程序中的实体框架不同上下文异常的主要内容,如果未能解决你的问题,请参考以下文章

asp.net中的ADO.NET实体框架适用于不同的数据库及其性能

ASP.NET Core Blazor 服务器中的实体框架上下文生命周期

ASP.NET MVC3 和实体框架代码优先架构

带有实体框架的 ASP.NET MVC Core 项目中的种子角色

ASP.NET 5 ,想要将实体框架从 Web 项目中分离出来

如果我想将两个不同表中的 2 个值相乘,我应该在迁移中输入啥? ASP.NET MVC 实体框架