如何在EF中分离子导航属性?

问题描述 投票:0回答:1

我们正在使用下面的代码,它表示子导航属性已附加的实体。不知道怎么了。

using (var context = new DataContext())
{
    var dbWorkflowType = (from dbEntity in context.Parent.AsNoTracking() select dbEntity)
                    .Where(w => w.Id == Id).Include(r => r.NavigationPropery).FirstOrDefault();

    if (NavigationPropery.Any(< expression >))
    {
        // Do some operations
    }
}

//few other business logic 

using (var context = new DataContext())
{
    foreach (NavigationProperty d in parentObj.NavigationProperies)
    {
        context.Entry(d).State = d.Id == 0 ? EntityState.Added : EntityState.Modified; // Error is at this line
    }
}

您能帮忙吗?

c# entity-framework datacontext
1个回答
0
投票

如果您有多个DataContext-您在这里拥有什么,则必须非常小心。

您不能从一个上下文中获取对象,然后尝试将其保存到另一个上下文中。如果要这样做,则必须将其从一个上下文中分离出来,然后附加到另一个上下文中,但对于任何链接的(Navigation-)属性也是如此。

因此,如果是新创建的,则仅对d.ID == 0的测试进行测试。它可以不等于0,但不能在此Context中,因为它已附加到另一个Context。不必将状态设置为“修改”,而必须附加它。

但是您仅使用一个上下文会更简单。始终在同一上下文中执行Load-Modify-Safe。

您可以将多个上下文用于其他查询,但不能用于此Select-Modify-Save方案。

© www.soinside.com 2019 - 2024. All rights reserved.