如何使用实体框架关联来自多个上下文的对象

本文关键字:上下文 对象 何使用 实体 框架 关联 | 更新日期: 2023-09-27 17:48:53

我是实体框架的新手,所以请耐心等待…

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

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

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

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

万一你还没有找到,EF上有一个很好的问题http://blogs.msdn.com/dsimmons/pages/entity-framework-faq.aspx

据我所知,您希望尽可能少地实例化您的模型(通过"new XXXXEnties()"位)。根据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;