我在Controller中有这段代码:
public JsonResult getSmetkiList()
{
List<smetki> smetkiLST = new List<smetki>();
using (leskaEntities dc = new leskaEntities())
{
smetkiLST = dc.smetkis.OrderBy(a => a.smID).ToList();
}
return new JsonResult { Data = smetkiLST, JsonRequestBehavior = JsonRequestBehavior.AllowGet };
}
如果我尝试访问列表我得到服务器错误500网络调试,并在浏览器中我有这个错误:
&#39; /&#39;中的服务器错误应用
ObjectContext实例已被释放,不能再用于需要连接的操作。
描述:执行当前Web请求期间发生了未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。
异常详细信息:System.ObjectDisposedException:ObjectContext实例已被释放,不能再用于需要连接的操作。
来源错误:
在执行当前Web请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪来识别有关异常的起源和位置的信息。
这是smetki类:
public int smID { get; set; }
[DisplayName("Dobavuvac")]
public int firmaID { get; set; }
[DataType(DataType.Date), DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:dd.MM.yyyy}"), DisplayName("Datum")]
public DateTime datumSM { get; set; }
[DisplayName("Beleska")]
public string noteSM { get; set; }
public virtual firmi firmi { get; set; }
public virtual ICollection<trosoci> trosocis { get; set; }
public List<trosoci> trosociL { get; set; }
public decimal NetTotalTR
{
get
{
if (trosocis == null)
{
return decimal.Zero;
}
return trosocis.Sum((trosoci i) => i.vkupnot);
}
}
答案 0 :(得分:0)
现在我看到了您的smetki
课程,我可以说问题是您正在尝试返回smetki
的集合。
smetki
类有一个引用集合(如ICollection<trosoci> trosocis
)。它是一个虚拟集合,需要打开连接才能进行迭代。
因此,当您的using
完成并且您尝试序列化为json这些引用集合时,它仍然在寻找已关闭(处置)的数据库连接。
解决方案非常简单:您只需要在没有链接集合的情况下转换(Map)smetki
类(它可能被称为视图模型类)。而且,如果您需要序列化所有链接的实体/集合,那么您还需要为这些类创建视图模型。
希望这会有所帮助。
如果您还有任何问题,请随时提出。
答案 1 :(得分:0)
因为我有删除控制器,现在我从托管项目中反编译,并且通过反编译我有这个代码:
public JsonResult getSmetkiList()
{
List<smetki> data = new List<smetki>();
using (leskaEntities leskaEntities = new leskaEntities())
{
leskaEntities.Configuration.LazyLoadingEnabled = false;
data = (from a in leskaEntities.smetkis
orderby a.smID
select a).ToList<smetki>();
}
return new JsonResult
{
Data = data,
JsonRequestBehavior = JsonRequestBehavior.AllowGet
};
}
使用此代码工作属性JSON结果列表。
当我尝试重新编写有问题的代码时,我有这个错误。
这是正确的代码:
public JsonResult getSmetkiList()
{
List<smetki> datasm = new List<smetki>();
using (leskaEntities dc = new leskaEntities())
{
dc.Configuration.LazyLoadingEnabled = false;
datasm = dc.smetkis.OrderBy(a => a.smID).ToList();
}
return new JsonResult { Data = datasm, JsonRequestBehavior = JsonRequestBehavior.AllowGet };
}
答案 2 :(得分:0)
我假设您的smetki
类来自数据库。它包含另一个类(trosoci
)的外键。现在当你从数据库加载smetki
时,它会进行延迟加载,这意味着它知道应该有一个trosoci
,但是没有加载它的数据。
现在,当您尝试在视图中访问此trosoci
的任何属性时,它需要在访问相关属性之前从数据库加载trosoci
对象。由于数据库的上下文已经关闭,因此无法加载有问题的数据并抛出给定的异常。
可能的解决方案:
a)将延迟加载更改为急切加载(全局或专门用于trosoci
dc.smetkis.Fetch(customer).OrderBy(a => a.smID).ToList();
或者您的ORM的正确命令
b)将您需要的所有内容映射到模型中,同时您的上下文(使用)仍处于打开状态,以便您的代码可以再次向数据库询问缺少的数据
c)对对象进行虚拟序列化(使用JavaScriptSerializer
),这将访问所有字段,从而从数据库加载它们。