Domanda

Sono molto nuovo nel framework delle entità, quindi per favore abbi pazienza con me ...

Come posso mettere in relazione due oggetti provenienti da contesti diversi?

L'esempio seguente genera la seguente eccezione:

  

System.InvalidOperationException: The   relazione tra i due oggetti   non può essere definito perché lo sono   collegato a diversi ObjectContext   oggetti.

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

L'uso di un contesto non è un'opzione perché stiamo usando l'EF in un'applicazione ASP.NET.

È stato utile?

Soluzione

Dovrai utilizzare lo stesso contesto (puoi passare il contesto al metodo getdefaultrole) o ripensare le relazioni ed estendere l'entità.

EDIT: Volevo aggiungere questo era per l'esempio fornito, usando asp.net ti richiederà di pensare a fondo il tuo contesto e i progetti di relazione.

Potresti semplicemente passare il contesto .. 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;
}

Altri suggerimenti

Un altro approccio che è possibile utilizzare qui è quello di staccare gli oggetti da un contesto e quindi collegarli a un altro contesto. È un po 'un trucco e potrebbe non funzionare nella tua situazione, ma potrebbe essere un'opzione.

    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ì, lavorare in 2 o più contesti non è supportato in V1 di Entity Framework.

Nel caso in cui non l'avessi già trovato, c'è una buona domanda su EF in http://blogs.msdn.com/dsimmons/pages/entity-framework-faq.aspx

Da quello che ho capito, vuoi creare un'istanza del tuo modello (tramite il bit "nuovo XXXXEntities ()" il più raramente possibile. Secondo MS ( http://msdn.microsoft.com/en-us/ library / cc853327.aspx ), questo è un successo piuttosto sostanziale. Quindi avvolgerlo in una struttura using () non è una buona idea. Quello che ho fatto nei miei progetti è accedervi attraverso un metodo statico che fornisce sempre la stessa istanza del contesto:

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

E poi lo recupero in questo modo:

    private PledgeManagerEntities entities = Data.PledgeManagerEntities;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top