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.

Foi útil?

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;
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top