实体框架持久保存对象列表

时间:2014-02-28 16:20:16

标签: entity-framework list servicestack deep-copy

我正在使用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的名称)。

因此,有了这个错误,我可以验证问题与处理类似“虚拟”列表的列表有关,并且它的对象不会返回到客户端,而是作为引用或类似的东西传递。 那么如何深度复制此列表并检索它的克隆呢?

非常感谢

1 个答案:

答案 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();