3 c# asp.net-mvc dispose entity-framework
我已经看过这个问题一百万次,但我遇到的每一个建议我似乎已经覆盖了.
我的MVC解决方案中有实体框架,我有一个'存储库',它试图检索MyObjects 的集合:
public static List<MyObject> GetMyObjects()
{
using (var context = new MyEntities())
{
return context.MyObjects.Include("Contact").OrderByDescending(o => o.Date).ToList();
}
}
Run Code Online (Sandbox Code Playgroud)
我将此方法称为控制器操作的一部分,该操作尝试将其序列化:
public JsonResult All()
{
return Json(MyRepository.GetMyObjects(), JsonRequestBehavior.AllowGet);
}
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
ObjectContext实例已被释放,不能再用于需要连接的操作.
我不知道在哪里开启这个,我欣赏实体框架'懒加载'关系数据集,如果需要它们,我感谢尝试序列化整个集合确实会尝试加载这些(在使用声明),但我有"包括".
我试过的
我已经尝试了'包含',我也确保没有其他关联是MyObject该类的一部分(即我没有其他Include()的可写).
为避免这种情况,您有一些选项.不要将导航属性声明为virtual或禁用上下文中的延迟加载行为.默认情况下启用延迟加载,通过创建派生代理类型的实例然后覆盖virtual属性以添加加载挂钩来实现.因此,如果您想使用序列化程序,我建议您关闭延迟加载:
public class YourContext : DbContext
{
public YourContext()
{
this.Configuration.LazyLoadingEnabled = false;
}
}
Run Code Online (Sandbox Code Playgroud)
这些链接可以帮助您更好地理解我在答案中解释的内容:
如果virtual从导航属性中删除关键字,则POCO实体不符合第二个链接中描述的要求,因此,EF不会创建代理类来延迟加载导航属性.但是,如果您禁用延迟加载,即使您的导航属性是virtual,它们也不会加载到任何实体中.在使用序列化程序时禁用延迟加载是个好主意.大多数序列化程序通过访问类型实例上的每个属性来工作.
作为第三个选项,您可以在导航属性上使用JsonIgnore属性,您不希望将其序列化为实体的一部分,但正如我之前所说,最好的选择是禁用延迟加载.
| 归档时间: |
|
| 查看次数: |
6631 次 |
| 最近记录: |