如何使用entity framework关联来自多个上下文的对象

我对entity framework新,所以请耐心等待……

如何将来自不同上下文的两个对象关联在一起?

以下示例引发以下exception:

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; } 

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

您将必须使用相同的上下文(您可以将上下文传递给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; } 

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

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

是的 – entity frameworkV1中不支持跨2个或更多上下文工作。

如果您还没有找到它,那么在http://blogs.msdn.com/dsimmons/pages/entity-framework-faq.aspx上有一个很好的常见问题解答。

根据我的理解,您希望尽可能少地实例化您的模型(通过“新的XXXXEntities()”位)。 根据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;