从表中获取实体列表会导致500错误-Entity Framework

时间:2018-07-22 00:19:51

标签: c# sql-server entity-framework

我正在Angular2(前端)和后端Web API 2上构建SPA,使用OWIN和Identity进行身份验证,并将Ninject用作DI的容器。

我想返回经理列表作为json响应。以及其相关的ContactDetail数据。它们在我的数据库中是一对一关联的。但是我得到500错误作为响应。为什么会出现此错误?

Microsoft SQL Server Diagram

经理班

   public partial class Manager
{
    public int Id { get; set; }
    public string Name { get; set; }

    public virtual ContactDetail ContactDetail { get; set; }
}

ContactDetail类

    public partial class ContactDetail
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string SecondName { get; set; }
    public string LastName { get; set; }

    public virtual Manager Manager { get; set; }
}

上下文

 public partial class LightCRMEntities : DbContext
{
    public LightCRMEntities()
        : base("name=LightCRMEntities")
    {
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        throw new UnintentionalCodeFirstException();
    }

    public virtual DbSet<ContactDetail> ContactDetails { get; set; }
    public virtual DbSet<Manager> Managers { get; set; }
}

API控制器

[Authorize(Roles = "Admin, Moderators")]

public class ManagerAPIController : ApiController
{
    private IManagerRepository _iManagerRepository;

    public ManagerAPIController(IManagerRepository iManagerRepository)
    {
        _iManagerRepository = iManagerRepository;
    }


    [HttpGet]
    [Route("api/AllManagers")]
    public IHttpActionResult GetAllManagers()
    {
        var managers = _iManagerRepository.Managers;
        return Json(managers);
    }
}

存储库:

 public class EFManagerRepository : IManagerRepository
{
    public IEnumerable<Manager> Managers
    {
        get
        {
            using (LightCRMEntities context = new LightCRMEntities())
            {
                return context.Managers.ToList();

            }
        }
    }

}

Error

  
      
  • ContactDetail'(((System.Data.Entity.DynamicProxies.Manager_63305B0F1D8DAA0805603D889C6E3A5114E3050AEE610FE775000D2270697C1F)(新的System.Collections.Generic.Mscorlib_CollectionDebugView(managers).Items [0] System异常,类型为'异常',类型为'异常',类型为'System'M',类型为'Exception',类型为'C'的异常)'。 .ContactDetail {System.ObjectDisposedException}
  •   

回复:

我收到500(内部服务器错误)

  

ExceptionMessage   :   “从'System.Data.Entity.DynamicProxies.Manager_63305B0F1D8DAA0805603D889C6E3A5114E3050AEE610FE775000D2270697C1F'上的'ContactDetail'获取值时出错。”   异常类型   :   “ Newtonsoft.Json.JsonSerializationException”

断点截屏: 尽管此刻未出现错误-我可以看到相关实体之一ContactDetail-加载有一些问题

breakpoint

我几乎不了解Configuration.ProxyCreationEnabled = false;的含义,但是如果我将其添加到上下文的构造函数中:

 public partial class LightCRMEntities : DbContext
{
    public LightCRMEntities()
        : base("name=LightCRMEntities")
    {
        Configuration.ProxyCreationEnabled = false;
    }
 // other code
}

然后我在控制台中得到200 OK和一个json对象: json response

但它不会加载相关对象-它具有NULL值-ContactDetail : 空

此请求的SQL事件探查器屏幕截图:

SQL profiler

数据库中的数据的屏幕截图:

data in database

1 个答案:

答案 0 :(得分:1)

感谢@ JWeezy,@ DavidG和其他人在原始帖子的评论部分找到了解决方案:

需要修改:

在上下文中禁用延迟加载

上下文

count_perms

在存储库中使用急切加载

public partial class LightCRMEntities : DbContext
{
    public LightCRMEntities()
        : base("name=LightCRMEntities")
    {
        Configuration.LazyLoadingEnabled = false;
    }
// other code
}

在ContactDetail类中,将 [JsonIgnore] 属性添加到了     虚拟财产

public class EFManagerRepository : IManagerRepository
{
    public IEnumerable<Manager> Managers
    {
        get
        {
            using (LightCRMEntities context = new LightCRMEntities())
            {
                return context.Managers.Include("ContactDetail").ToList();

            }
        }
    }
}