【问题标题】:Entity Framework persist a list of Objects实体框架持久化对象列表
【发布时间】:2014-02-28 16:20:16
【问题描述】:

我使用服务堆栈作为我系统的 API,我使用实体框架从我的 SQL Server 数据库中获取数据。虽然,我无法从实体框架生成的对象列表中检索任何数据。

[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 实例已被释放,不能再用于需要连接的“操作”(数据库名称)。

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

还是谢谢

【问题讨论】:

    标签: entity-framework list servicestack deep-copy


    【解决方案1】:

    当上下文被释放时,列表似乎不再可访问,可能是因为变量是在上下文范围内定义的。尝试在 using 语句之外定义 dbItems:

    public object Any(GetInterventions request)
    {
        List<Intervention> dbItems;
    
        using (var dbConnection = new operationsContext())
        {
            dbItems = dbConnection.Interventions.ToList();
        }
    
        return new GetInterventionsResponse{
            interventions = dbItems
        };
    }
    

    此外,如果您希望加载干预的导航属性,您可能会遇到此问题,因为 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();
    

    【讨论】:

    • 这不能解决我的问题。我认为它必须这样做,例如 Persons 也有一个虚拟对象,例如“Car”
    • 问题是 VS 说每个 x => x.Client 或我放入 Include 的任何内容都是“无法将 lambda 表达式转换为字符串类型,因为它不是委托类型”
    • 我试过 Include("Client") 但我得到了 stackoverflowException
    • 通常最好使用 lambda 表达式而不是字符串,因为它们是强类型的。确保在文件顶部包含 using System.Data.Entity;,以便您可以使用 lambda 表达式进行包含。
    • 我认为现在 stackoverflow 异常与 ServiceStack 的 JSON 响应的最大大小有关。您的回答是正确的:) 感谢您的帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-19
    • 1970-01-01
    • 1970-01-01
    • 2014-11-22
    • 1970-01-01
    • 2020-09-17
    相关资源
    最近更新 更多