Как связать объекты из нескольких контекстов, используя Entity Framework - PullRequest
14 голосов
/ 01 октября 2008

Я очень новичок в структуре сущностей, поэтому, пожалуйста, потерпите меня ...

Как я могу связать два объекта из разных контекстов вместе?

В приведенном ниже примере выдается следующее исключение:

System.InvalidOperationException: отношения между двумя объектами не может быть определено, потому что они прикреплен к другому ObjectContext объекты.

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

Использование одного контекста не вариант, потому что мы используем EF в приложении ASP.NET.

Ответы [ 4 ]

11 голосов
/ 01 октября 2008

Вам придется использовать тот же контекст (вы можете передать контекст методу getdefaultrole) или переосмыслить отношения и расширить сущность.

РЕДАКТИРОВАТЬ: хотел добавить это было для приведенного примера, использование asp.net потребует от вас полностью продумать ваш контекст и дизайн отношений.

Вы могли бы просто передать контекст .. 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;
}
3 голосов
/ 17 июля 2009

Другой подход, который вы можете использовать здесь, состоит в том, чтобы отделить объекты от одного контекста, а затем присоединить их к другому контексту. Это что-то вроде хака, и это может не сработать в вашей ситуации, но это может быть вариант.

    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();
    }
2 голосов
/ 19 марта 2009

Насколько я понимаю, вы хотите создать экземпляр вашей модели (через бит "new XXXXEntities ()") как можно реже. Согласно MS (http://msdn.microsoft.com/en-us/library/cc853327.aspx),) это довольно существенный удар по производительности. Так что оборачивать его в структуру using () не очень хорошая идея. Я сделал в своих проектах доступ к нему через статический метод, который всегда предоставляет один и тот же экземпляр контекста:

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

А потом я получаю это так:

    private PledgeManagerEntities entities = Data.PledgeManagerEntities;
2 голосов
/ 04 октября 2008

Да - работа в двух или более контекстах не поддерживается в V1 Entity Framework.

На тот случай, если вы его еще не нашли, на EF есть хороший FAQ: http://blogs.msdn.com/dsimmons/pages/entity-framework-faq.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...