Question

Je suis très novice dans le cadre de l'entité, alors veuillez vous en tenir à moi ...

Comment puis-je mettre en relation deux objets provenant de contextes différents?

L'exemple ci-dessous lève l'exception suivante:

  

System.InvalidOperationException: le   relation entre les deux objets   ne peuvent pas être définis car ils sont   attaché à différents ObjectContext   objets.

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’utilisation d’un seul contexte n’est pas une option car nous utilisons l’EF dans une application ASP.NET.

Était-ce utile?

La solution

Vous devrez utiliser le même contexte (vous pouvez le transmettre à la méthode getdefaultrole) ou repenser les relations et étendre l'entité.

EDIT: Je voulais ajouter que c'était pour l'exemple fourni. Pour utiliser asp.net, vous devrez bien réfléchir à votre contexte et à la conception de vos relations.

Vous pouvez simplement passer le contexte .. 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;
}

Autres conseils

Une autre approche que vous pouvez utiliser ici consiste à dissocier des objets d'un contexte, puis à les attacher à un autre contexte. C'est un peu un bidouillage, et cela peut ne pas fonctionner dans votre situation, mais cela pourrait être une option.

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

Oui - le travail dans 2 contextes ou plus n'est pas pris en charge dans Entity Framework V1.

Au cas où vous ne l'auriez pas déjà trouvée, il existe une bonne FAQ sur EF à l'adresse http://blogs.msdn.com/dsimmons/pages/entity-framework-faq.aspx

D'après ce que j'ai compris, vous souhaitez instancier votre modèle (via le bit "new XXXXEntities ()") aussi rarement que possible. Selon MS ( http://msdn.microsoft.com/en-us/ library / cc853327.aspx ), les performances ont été considérablement affectées. Donc, l'envelopper dans une structure using () n'est pas une bonne idée. Ce que j'ai fait dans mes projets, c'est d'y accéder via une méthode statique qui fournit toujours la même instance du contexte:

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

Et puis je le récupère comme suit:

    private PledgeManagerEntities entities = Data.PledgeManagerEntities;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top