Как связать объекты из нескольких контекстов, используя Entity Framework

.net c# entity-framework

Вопрос

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

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

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

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.

Принятый ответ

Вам придется использовать тот же контекст (вы можете передать контекст методу 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;
}

Популярные ответы

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

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


Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему