我有一个规范化的数据库,我正在使用EF4.3。
在这种情况下,我有一个用户(每个人都是用户)。有些是订阅者,订阅者是贡献者,成员或管理员。
因此,对于每种类型的用户,我都会通过导航属性包含适当的关联。
所以会员linq声明会是这样的:
var u = r.FindBy(x => x.UserId == userId)
.Include("Subscribers")
.Include("Members")
.SingleOrDefault();
就对象而言,每个人都是用户 - 只是不同的排列。
当我没有包含某些导航属性时,我正试图在代码中处理这个问题的最佳方法。例如,我不会在上面的示例中包含Contributor或Administrator。通常我可以检查user.subscriber.contributor不是NULL,但是我得到了“对象上下文已被处理......”,即使我做了这个检查。
我该如何解决这个问题?
答案 0 :(得分:0)
您正在接收异常,因为您的实体被代理以进行延迟加载,并且在您处理上下文之前它们未被正确分离。分离具有加载关系的实体是不可能的(您必须通过serizliazation创建深层副本),因此在这种情况下,最好的解决方案是关闭延迟加载。在这种情况下,您的实体将不会尝试首次访问的延迟加载导航属性。
objectContext.ContextOptions.LazyLoadingEnabled = false;
您也可以关闭整个代理创建:
objectContext.ContextOptions.ProxyCreationEnabled = false;