我已经看过这个问题一百万次,但我遇到的每一个建议我似乎已经覆盖了 .
我的MVC解决方案中有实体框架,我有'repository'试图检索 MyObject
的集合:
public static List<MyObject> GetMyObjects()
{
using (var context = new MyEntities())
{
return context.MyObjects.Include("Contact").OrderByDescending(o => o.Date).ToList();
}
}
我将此方法称为控制器操作的一部分,该操作尝试将其序列化:
public JsonResult All()
{
return Json(MyRepository.GetMyObjects(), JsonRequestBehavior.AllowGet);
}
我收到以下错误:
The ObjectContext instance has been disposed and can no longer be used for operations that require a connection.
我不知道在哪里开启这个,我很欣赏实体框架'lazy-loads'关系数据集,如果需要它们,我很欣赏尝试序列化整个集合确实会尝试加载这些(在使用声明),但我有“包括” .
What I've Tried
我've tried the '包括', I' ve也确保没有其他关联是 MyObject
类的一部分(即我没有其他 Include()
s写) .
3 回答
我有同样的问题并解决如下;
我创建了一个新对象,并在从db获取对象后放置我将要使用的值 .
示例代码:
为避免这种情况,您有一些选项 . 不要将导航属性声明为
virtual
或在您的上下文中禁用 Lazy Loading 行为 . 默认情况下启用延迟加载,通过创建派生代理类型的实例,然后重写virtual
属性以添加加载挂钩来实现 . 因此,如果您想使用序列化程序,我建议您关闭延迟加载:这些链接可以帮助您更好地理解我在答案中解释的内容:
Loading Related Entities
Requirements for Creating POCO Proxies
如果从导航属性中删除
virtual
关键字,则POCO实体不符合第二个链接中描述的要求,因此,EF不会创建代理类来延迟加载导航属性 . 但是如果你禁用了延迟加载,即使你的导航属性是virtual
,当你使用序列化程序时,他们也会赢得't be loaded in any entity. It'好主意禁用延迟加载 . 大多数序列化程序通过访问类型实例上的每个属性来工作 .作为第三个选项,您可以在导航属性上使用JsonIgnore属性,不希望将其序列化为实体的一部分,但正如我之前所说,最好的选择是禁用延迟加载 .
当您使用Include并使用Lazy加载,并将dbContext包装在Using语句中时,一旦它尝试获取链接对象,dbContext就已经被释放 . 您可以尝试急切加载导航属性,如下所示:
或者您可以取出Using语句,因为它限制了您的延迟加载...