如何使用實體框架關聯來自多個上下文的對象

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

使用一個上下文不是一個選項,因為我們在ASP.NET應用程序中使用EF。

一般承認的答案

您將必須使用相同的上下文(您可以將上下文傳遞給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();
    }


Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因