So stellen Sie Objekte aus mehreren Kontexten mithilfe von Entity Framework in Beziehung

.net c# entity-framework

Frage

Ich bin sehr neu im Entity-Framework, also bitte ertragen Sie mich ...

Wie kann ich zwei Objekte aus verschiedenen Kontexten miteinander in Beziehung setzen?

Das folgende Beispiel löst die folgende Ausnahme aus:

System.InvalidOperationException: Die Beziehung zwischen den beiden Objekten kann nicht definiert werden, da sie an verschiedene ObjectContext-Objekte angehängt sind.

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

Die Verwendung eines Kontexts ist keine Option, da wir die EF in einer ASP.NET-Anwendung verwenden.

Akzeptierte Antwort

Sie müssen denselben Kontext verwenden (Sie können den Kontext an die Methode getdefaultrole übergeben) oder die Beziehungen überdenken und die Entität erweitern.

BEARBEITEN: Wollte ich hinzufügen, dass dies für das bereitgestellte Beispiel war, müssen Sie bei der Verwendung von asp.net Ihre Kontext- und Beziehungsdesigns vollständig durchdenken.

Sie könnten einfach den Kontext übergeben. 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;
}

Beliebte Antwort

Ein anderer Ansatz, den Sie hier verwenden könnten, besteht darin, Objekte von einem Kontext zu trennen und sie dann an einen anderen Kontext anzuhängen. Das ist ein bisschen ein Hack und es funktioniert möglicherweise nicht in Ihrer Situation, aber es könnte eine Option sein.

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


Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum