我一直在添加不同实体的部分类,以便添加各种有用的方法而不会出现问题。
基于我见过的例子,尝试添加属性似乎很简单,但我的失败却很糟糕。
已更新示例:
public List<Friend> FriendsInGoodStanding
{
get
{
using (var context = new GarbageEntities())
{
var a = context.Friends.Include("aspnet_User1").Where(f => f.UserID == this.UserId && f.Blocked == false).ToList();
var b = context.Friends.Include("aspnet_User").Where(f => f.FriendUserID == this.UserId && f.Blocked == false).ToList();
a.AddRange(b);
return a.Distinct().ToList();
}
}
}
我在尝试使用此属性时收到以下错误:
ObjectContext实例已经存在 处置,不能再使用了 需要连接的操作。
Line 4936: get
Line 4937: {
Line 4938: return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedReference<aspnet_User>("GarbageModel.FK_Friends_aspnet_Users", "aspnet_User").Value;
Line 4939: }
这一定是我忽略的显而易见的事情。
答案 0 :(得分:4)
此错误的根源是因为您的程序正在尝试“延迟加载”您朋友实体对象上的某个导航属性,当您已经阅读 FriendsInGoodStanding 属性并且objectcontext具有因使用声明而被处置。
现在,我可以看到你急于加载“aspnet_User1”,并且你在查询结束时调用ToList(),所以它必须是 Friend 对象上的另一个导航属性。如果您显示使用 FriendsInGoodStanding 属性的客户端代码,那么我可以确切地知道哪一个是那个但是现在我的预感是你在Friend对象上有一个名为aspnet_User的属性,它也需要急切加载像这样:
public partial class aspnet_User{
public List FriendsInGoodStanding {
get {
using (var context = new GarbageEntities()) {
var a = context.Friends
.Include("aspnet_User1")
.Include("aspnet_User")
.Where(f => f.UserID == this.UserId && f.Blocked == false).ToList();
var b = context.Friends
.Include("aspnet_User")
.Include("aspnet_User1")
.Where(f => f.FriendUserID == this.UserId && f.Blocked == false).ToList();
a.AddRange(b);
return a.Distinct().ToList();
}
}
}
}
另一种解决方案:
将禁用延迟加载为您的对象上下文来克服此异常。您可以通过右键单击模型,然后选择属性,然后找到“Lazy Loading Enabled”选项,默认情况下为true,只需将其设置为false即可。或者以编程方式编写代码:
var context = new GarbageEntities();
context.ContextOptions.LazyLoadingEnabled = false;
禁用后,您仍可以根据需要明确加载相关数据,或者 甚至加载数据和初始查询。 请注意NullReferenceException!