Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用实体框架关联来自多个上下文的对象_C#_.net_Entity Framework - Fatal编程技术网

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

C# 如何使用实体框架关联来自多个上下文的对象,c#,.net,entity-framework,C#,.net,Entity Framework,我对实体框架非常陌生,所以请容忍我 如何将来自不同上下文的两个对象关联在一起 下面的示例引发以下异常: System.InvalidOperationException:异常 两个对象之间的关系 无法定义,因为它们是 附加到不同的ObjectContext 对象 使用一个上下文不是一个选项,因为我们在ASP.NET应用程序中使用EF。您必须使用相同的上下文(您可以将上下文传递给getdefaultrole方法),或者重新考虑关系并扩展实体 编辑:想要添加这一点是因为提供了一个示例,使用asp.n

我对实体框架非常陌生,所以请容忍我

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

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

System.InvalidOperationException:异常 两个对象之间的关系 无法定义,因为它们是 附加到不同的ObjectContext 对象


使用一个上下文不是一个选项,因为我们在ASP.NET应用程序中使用EF。

您必须使用相同的上下文(您可以将上下文传递给getdefaultrole方法),或者重新考虑关系并扩展实体

编辑:想要添加这一点是因为提供了一个示例,使用asp.net将要求您充分考虑您的上下文和关系设计

您只需传递上下文即可。。即:

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

是-Entity Framework的V1不支持跨2个或更多上下文工作


以防您还没有找到它,在EF上有一个很好的faq,据我所知,您希望尽可能少地实例化您的模型(通过“new XXEntities()”位)。根据MS(),这是相当大的性能打击。因此,将其包装在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;

这里可以使用的另一种方法是从一个上下文分离对象,然后将它们附加到另一个上下文。这有点像黑客,在你的情况下可能不起作用,但这可能是一种选择

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

为什么命名数据上下文类型
TCPSEntities
,为什么命名数据上下文对象
model
?您可能会考虑不使用
new
,而是将预构建的数据上下文或数据上下文工厂传递给函数。您还可以考虑使用
Enumerable.SingleOrDefault
而不是
Enumerable.First
。旧文章但很好的参考链接…现在正在维护它。现在就这样做。这称为Singleton模式。有几件事:(1)我认为您必须小心这样做,因为上下文将跟踪它加载的任何实体,从而导致实例变大。(2) 您引用的文章还指出:“在大多数情况下,您应该在using语句中创建ObjectContext实例”。(3) 如果对SaveChanges()的一个调用失败,那么所有后续调用都可能失败,除非您分离失败的实体。如果有多个呼叫者使用相同的上下文,那么您可能会陷入混乱。(4) ObjectContext不是ThreadSafe这对于web应用程序来说是绝对不安全的,并且性能增益可以忽略不计。除特殊情况外,通常每个业务操作都应该使用一个上下文。这通常意味着每个页面/窗口使用一个上下文。@Kurian-对于ASP.NET应用程序,您完全正确。当我三年前回答这个问题时,我怀疑我三年前读得足够仔细,是否意识到:-)。
    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();
    }