Como relacionar objetos de múltiplos contextos usando o Entity Framework
-
03-07-2019 - |
Pergunta
Estou muito novo para a estrutura de entidade, urso então por favor comigo ...
Como posso relacionar dois objetos de diferentes contextos juntos?
O exemplo a seguir lança a seguinte exceção:
System.InvalidOperationException: O relação entre os dois objectos não pode ser definida porque eles são ligado a ObjectContext diferente objetos.
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;
}
Usando um contexto não é uma opção, porque estamos usando o EF em um aplicativo ASP.NET.
Solução
Você terá que usar o mesmo contexto (você pode passar o contexto para o método getdefaultrole) ou repensar as relações e ampliar a entidade.
EDIT: queria adicionar este foi para o exemplo fornecido, usando asp.net vai exigir que você acha totalmente fora seus projetos de contexto e de relacionamento
.Você poderia simplesmente passar o contexto .. 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;
}
Outras dicas
Outra abordagem que você pode usar aqui é separar objetos de um contexto e, em seguida, anexá-los a um outro contexto. Isso é um pouco de um truque, e ele pode não funcionar em sua situação, mas pode ser uma opção.
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();
}
Sim. - trabalhando por 2 ou mais contextos não é suportado no V1 da Entity Framework
Apenas no caso de você ainda não tiver encontrado, há uma boa FAQ sobre EF em http://blogs.msdn.com/dsimmons/pages/entity-framework-faq.aspx
Pelo que eu entendo, você quer instanciar seu modelo (através dos "novos XXXXEntities ()" bit) como raramente possível. De acordo com a MS ( http://msdn.microsoft.com/en-us/ biblioteca / cc853327.aspx ), que é um acerto de desempenho bastante substancial. Então, envolvê-lo em uma estrutura usando () não é uma boa idéia. O que eu fiz em meus projetos é para acessá-lo através de um método estático que proporciona sempre a mesma instância do contexto:
private static PledgeManagerEntities pledgesEntities;
public static PledgeManagerEntities PledgeManagerEntities
{
get
{
if (pledgesEntities == null)
{
pledgesEntities = new PledgeManagerEntities();
}
return pledgesEntities;
}
set { pledgesEntities = value; }
}
E então eu recuperá-la assim:
private PledgeManagerEntities entities = Data.PledgeManagerEntities;