我正在使用Service Stack作为我系统的API,而我正在使用Entity Framework从我的SQL Server DataBase中获取数据。虽然,我无法从实体框架生成的对象列表中检索任何数据。
[Route("/getInterventions","GET")]
public class GetInterventions
{
}
public class GetInterventionsResponse
{
public List<Intervention> interventions { get; set; }
public ResponseStatus ResponseStatus { get; set; }
}
public class GetInterventionsService : Service
{
public object Any(GetInterventions request)
{
using (var dbConnection = new operationsContext())
{
List<Intervention> dbItems = dbConnection.Interventions.ToList();
return new GetInterventionsResponse{
interventions = dbItems
};
}
}
}
从客户端我得到:
ObjectContext实例已被释放,不能再用于需要连接的“操作”(db的名称)。
因此,有了这个错误,我可以验证问题与处理类似“虚拟”列表的列表有关,并且它的对象不会返回到客户端,而是作为引用或类似的东西传递。 那么如何深度复制此列表并检索它的克隆呢?
非常感谢
答案 0 :(得分:3)
当上下文被释放时,看起来列表不再可访问,可能是因为变量是在上下文的范围内定义的。尝试在using语句之外定义dbItem:
public object Any(GetInterventions request)
{
List<Intervention> dbItems;
using (var dbConnection = new operationsContext())
{
dbItems = dbConnection.Interventions.ToList();
}
return new GetInterventionsResponse{
interventions = dbItems
};
}
此外,如果您希望加载Interventions的导航属性,则可能会遇到此问题,因为EF使用延迟加载,因此它们不会与您的代码一起使用。例如,如果Intervention具有Person导航属性,则需要包含该属性以使其可用。像这样:
dbItems = dbConnection.Interventions.Include(x => x.Persons).ToList();
根据以下评论进行修改:
您还可以包含多个级别,如下所示:
dbItems = dbConnection.Interventions.Include(x => x.Persons.Car).ToList();
或嵌套列表...
dbItems = dbConnection.Interventions.Include(x => x.Persons.Select(y => y.Cars).ToList();
或多个导航属性...
dbItems = dbConnection.Interventions.Include(x => x.Persons)
.Include(x => x.Cars).ToList();