定制财产:必须明显我做错了

时间:2010-09-13 01:46:02

标签: asp.net-mvc-2 entity-framework-4

我一直在添加不同实体的部分类,以便添加各种有用的方法而不会出现问题。

基于我见过的例子,尝试添加属性似乎很简单,但我的失败却很糟糕。

已更新示例:

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

这一定是我忽略的显而易见的事情。

1 个答案:

答案 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!