我非常对实体框架不熟悉,所以请耐心等待......
如何将来自不同上下文的两个对象关联在一起?
以下示例引发以下异常:
System.InvalidOperationException:The 两个对象之间的关系 因为它们是无法定义的 附加到不同的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。
答案 0 :(得分: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;
}
答案 1 :(得分: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();
}
答案 2 :(得分:2)
是的 - 在实体框架V1中不支持跨2个或更多上下文工作。
万一你还没有找到它,http://blogs.msdn.com/dsimmons/pages/entity-framework-faq.aspx
上的EF有一个很好的常见问题答案 3 :(得分:2)
据我所知,您希望尽可能少地实例化您的模型(通过“新的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;