Pregunta

Soy muy nuevo en el marco de la entidad, así que por favor tenga paciencia conmigo ...

¿Cómo puedo relacionar dos objetos de diferentes contextos juntos?

El siguiente ejemplo muestra la siguiente excepción:

  

System.InvalidOperationException: la   relación entre los dos objetos   no se pueden definir porque son   adjunto a diferentes ObjectContext   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;
}

El uso de un contexto no es una opción porque estamos usando el EF en una aplicación ASP.NET.

¿Fue útil?

Solución

Tendrá que usar el mismo contexto (puede pasar el contexto al método getdefaultrole) o repensar las relaciones y extender la entidad.

EDITAR: Quería agregar esto para el ejemplo proporcionado, usar asp.net requerirá que piense por completo el contexto y los diseños de las relaciones.

Simplemente puedes pasar el 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;
}

Otros consejos

Otro enfoque que podrías usar aquí es separar objetos de un contexto y luego adjuntarlos a otro contexto. Eso es un poco pirateado y puede que no funcione en tu situación, pero podría ser una opción.

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

Sí, el trabajo en 2 o más contextos no es compatible con V1 de Entity Framework.

En caso de que aún no lo haya encontrado, hay un buen número de preguntas frecuentes sobre EF en http://blogs.msdn.com/dsimmons/pages/entity-framework-faq.aspx

Por lo que entiendo, desea crear una instancia de su modelo (a través del bit " new XXXXEntities () ") lo más raramente posible. Según MS ( http://msdn.microsoft.com/en-us/ library / cc853327.aspx ), es un éxito de rendimiento bastante importante. Así que envolverlo en una estructura using () no es una buena idea. Lo que he hecho en mis proyectos es acceder a él a través de un método estático que siempre proporciona la misma instancia del contexto:

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

Y luego lo recupero así:

    private PledgeManagerEntities entities = Data.PledgeManagerEntities;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top