C# 如何在web api get中返回IEnumerable DbSet?

C# 如何在web api get中返回IEnumerable DbSet?,c#,.net,entity-framework,asp.net-web-api,C#,.net,Entity Framework,Asp.net Web Api,“用户”类由实体框架模型首先设计者自动生成 public partial class user { public user() { this.distributorDevice = new HashSet<distributorDevice>(); this.managerDevice = new HashSet<managerDevice>(); this.logUserLogin = new HashSe

“用户”类由实体框架模型首先设计者自动生成

public partial class user
{
    public user()
    {
        this.distributorDevice = new HashSet<distributorDevice>();
        this.managerDevice = new HashSet<managerDevice>();
        this.logUserLogin = new HashSet<logUserLogin>();
        this.logUserOperates = new HashSet<logUserOperates>();
        this.clientApp = new HashSet<clientApp>();
    }

    public int Id { get; set; }
    public string name { get; set; }
    public byte[] password { get; set; }
    public bool isActive { get; set; }
    public System.DateTime RegisterTime { get; set; }
    public int permissionId { get; set; }
    public System.DateTime lastLoginTime { get; set; }

    public virtual permission permission { get; set; }
    public virtual ICollection<distributorDevice> distributorDevice { get; set; }
    public virtual ICollection<managerDevice> managerDevice { get; set; }
    public virtual ICollection<logUserLogin> logUserLogin { get; set; }
    public virtual ICollection<logUserOperates> logUserOperates { get; set; }
    public virtual ICollection<clientApp> clientApp { get; set; }
    public virtual customerDevice customerDevice { get; set; }
}
按照建议,我应该使用ToList()而不是numerable,我会这样更改代码

 public class UserController : ApiController
 {
 public IEnumerable<user> Get()
    {
        List<user> users = new List<user>();
        return user;
    }
 }
    public IEnumerable<user> Get()
    {
        using (var mydb = new ModelContainer())
        {
            return mydb.userSet.AsEnumerable();
        }
    }
using (var mydb = new ModelContainer())
        {
            var users = mydb.userSet.ToList();
            return users;
        }
var users = mydb.userSet.Where(p=>p.permission.name == "Admin").ToList();
return users;
但在explorer中仍然会出现相同的错误

103 (net::ERR_CONNECTION_ABORTED)
我在这里加了一个中断

return users;
发现用户已从数据库获取数据,但未正确返回到客户端

我做了更多的测试,我添加了一个权限名为“Admin”的用户,若我使用下面的代码,并没有找到用户,它会正确响应客户端

var users = mydb.userSet.Where(p=>p.permission.name == "Administrator").ToList();
return users;
如果我这样写

 public class UserController : ApiController
 {
 public IEnumerable<user> Get()
    {
        List<user> users = new List<user>();
        return user;
    }
 }
    public IEnumerable<user> Get()
    {
        using (var mydb = new ModelContainer())
        {
            return mydb.userSet.AsEnumerable();
        }
    }
using (var mydb = new ModelContainer())
        {
            var users = mydb.userSet.ToList();
            return users;
        }
var users = mydb.userSet.Where(p=>p.permission.name == "Admin").ToList();
return users;
返回客户端失败,给出错误消息

103 (net::ERR_CONNECTION_ABORTED)

EF使用延迟加载。这意味着在您尝试使用结果之前,EF实际上不会调用数据库

要绕过这个问题,你可以使用。与ToList不同,ToList将立即执行查询


另一个选项是不处理上下文。虽然这看起来可能是错误的,但实际上您可以让db上下文保持活动状态,并在不再使用任何返回的用户对象时让垃圾收集器获取它。

谢谢,我使用ToList()而不是AsEnumerable(),仍然不起作用。在垃圾收集之前保持db上下文打开是耗尽连接池的一个很好的方法。另外,
ToList
首先完全否定了公开
IQueryable
的性能优势…谢谢,我使用ToList()而不是AsEnumerable(),仍然不起作用。您是否使用了任何导航属性,我是的,您必须立即加载它们?谢谢,当我删除导航属性时,它起作用。在谷歌上讨论了如何处理它之后,我发现我应该添加DTO层。然后新的问题来了。许多作者说POCO比DTO好,但我认为DbContext就是POCO,所以我应该使用DTO+POCO?或者我完全走错了路。有没有办法只使用DbcontextAPI?最重要的是完全控制数据库上下文的范围。DTO是实现这种控制的一种方式,即学校方式。始终是imho,POCO是允许实例化对象的类型/类。对象(POCO类的实例)可以是与数据库上下文相关的实体,也可以是与数据库上下文不相关(分离)的DTO。您必须使用或不使用相同的类型/类来驱动从实体到DTO的转换。