14

我对实体框架陌生,所以请多多包涵...

如何将来自不同上下文的两个对象关联在一起?

下面的示例引发以下异常:

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。

4

4 回答 4

11

您将不得不使用相同的上下文(您可以将上下文传递给 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;
}
于 2008-10-01T18:34:15.970 回答
3

您可以在此处使用的另一种方法是将对象从一个上下文中分离,然后将它们附加到另一个上下文。这有点小技巧,它可能不适用于您的情况,但它可能是一种选择。

    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();
    }
于 2009-07-17T04:08:07.900 回答
2

是的 - 实体框架 V1 不支持跨 2 个或更多上下文工作。

以防万一您还没有找到它,在http://blogs.msdn.com/dsimmons/pages/entity-framework-faq.aspx上有一个很好的关于 EF 的常见问题解答

于 2008-10-04T18:42:52.273 回答
2

据我了解,您希望尽可能少地实例化您的模型(通过“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;
于 2009-03-18T21:04:50.117 回答