2008-10-01 75 views
14

多个上下文对象我新的实体框架,所以请多多包涵......如何与使用实体框架

我如何能与两个对象来自不同的上下文在一起?

下面的例子引发以下例外:

System.InvalidOperationException:两个对象,因为它们是 附连到不同的ObjectContext 对象 不能被定义之间的关系 。

void MyFunction() 
{ 
    using (TCPSEntities model = new TCPSEntities()) 
    { 
     EmployeeRoles er = model.EmployeeRoles.First(p=>p.EmployeeId == 123); 
     er.Roles = GetDefaultRole(); 
     model.SaveChanges(); 
    } 
} 

private static Roles GetDefaultRole() 
{ 
    Roles r = null; 
    using (TCPSEntities model = new TCPSEntities()) 
    { 
     r = model.Roles.First(p => p.RoleId == 1); 
    } 
    return r; 
} 

使用一个上下文是不是一种选择,因为我们使用的是EF在ASP.NET应用程序。

+0

为什么你的名字你的数据上下文类型`TCPSEntities`,以及为什么你的名字你的数据上下文对象`model`?您可能会考虑不使用`new`,而是将预构建的数据上下文或数据上下文工厂传递给该函数。你也可以考虑使用`Enumerable.SingleOrDefault`而不是`Enumerable.First`。 – yfeldblum 2009-05-03 17:07:16

回答

11

您必须使用相同的上下文(您可以将上下文传递给getdefaultrole方法),或重新考虑关系并扩展实体。

编辑:想要添加这是提供的示例,使用asp.net将需要你充分考虑你的上下文和关系设计。

你可以简单地通过上下文.. IE:

void MyFunction() 
{ 
    using (TCPSEntities model = new TCPSEntities()) 
    { 
     EmployeeRoles er = model.EmployeeRoles.First(p=>p.EmployeeId == 123); 
     er.Roles = GetDefaultRole(model); 
     model.SaveChanges(); 
    } 

} 

private static Roles GetDefaultRole(TCPSEntities model) 
{ 
    Roles r = null; 
    r = model.Roles.First(p => p.RoleId == 1); 
    return r; 
} 
2

是的 - 在2级或多个环境中工作的实体框架V1不支持。

万一你还没有发现它,对EF(“)新XXXXEntities(”经位)一个很好的常见问题解答:http://blogs.msdn.com/dsimmons/pages/entity-framework-faq.aspx

+1

旧的帖子,但很好的参考链接...它现在保持在http://www.ef-faq.org。 – Craig 2011-02-22 21:47:50

+0

使该http://social.technet。microsoft.com/wiki/contents/articles/entity-framework-faq.aspx。 – Kit 2011-11-11 20:10:28

2

据我了解,你要实例模型尽可能少。根据MS(http://msdn.microsoft.com/en-us/library/cc853327.aspx),这是相当可观的表现。因此将它封装在using()结构中并不是一个好主意。我已经在我的项目做的是通过总是提供上下文的同一个实例的静态方法来访问它:

private static PledgeManagerEntities pledgesEntities; 
    public static PledgeManagerEntities PledgeManagerEntities 
    { 
     get 
     { 
      if (pledgesEntities == null) 
      { 
       pledgesEntities = new PledgeManagerEntities(); 
      } 
      return pledgesEntities; 
     } 
     set { pledgesEntities = value; } 
    } 

然后我找回它,像这样:

private PledgeManagerEntities entities = Data.PledgeManagerEntities; 
3

另一种方法您可以在此处使用的是从一个上下文中分离对象,然后将它们附加到另一个上下文中。这有点破解,它可能不适用于你的情况,但它可能是一个选择。

public void GuestUserTest() 
    { 
     SlideLincEntities ctx1 = new SlideLincEntities(); 
     GuestUser user = GuestUser.CreateGuestUser(); 
     user.UserName = "Something"; 
     ctx1.AddToUser(user); 
     ctx1.SaveChanges(); 

     SlideLincEntities ctx2 = new SlideLincEntities(); 
     ctx1.Detach(user); 
     user.UserName = "Something Else"; 
     ctx2.Attach(user); 
     ctx2.SaveChanges(); 
    } 
0

还有就是my post一个,我搜索了几个一天的,使这个方法成为可能。

给我你的反馈,但我认为,可以帮助您更新EntityCollection