我们正在使用下面的代码,它表示子导航属性已附加的实体。不知道怎么了。
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
}
}
您能帮忙吗?
如果您有多个DataContext-您在这里拥有什么,则必须非常小心。
您不能从一个上下文中获取对象,然后尝试将其保存到另一个上下文中。如果要这样做,则必须将其从一个上下文中分离出来,然后附加到另一个上下文中,但对于任何链接的(Navigation-)属性也是如此。
因此,如果是新创建的,则仅对d.ID == 0的测试进行测试。它可以不等于0,但不能在此Context中,因为它已附加到另一个Context。不必将状态设置为“修改”,而必须附加它。
但是您仅使用一个上下文会更简单。始终在同一上下文中执行Load-Modify-Safe。
您可以将多个上下文用于其他查询,但不能用于此Select-Modify-Save方案。