首页 > 解决方案 > 从表中获取实体列表会导致 500 错误 - 实体框架

问题描述

我正在 Angular2(前端)和后端 Web API 2 上构建一个 SPA,其中 OWIN 和 Identity 用于身份验证,Ninject 作为 DI 的容器。

我想返回一个经理列表作为 json 响应。还有它相关的 ContactDetail 数据。它们在我的数据库中是一对一相关的。但我收到 500 错误作为响应。为什么我会收到此错误?

Microsoft SQL Server 图表

经理班

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

            }
        }
    }

}

错误

  • ContactDetail '((System.Data.Entity.DynamicProxies.Manager_63305B0F1D8DAA0805603D889C6E3A5114E3050AEE610FE775000D2270697C1F)(新 System.Collections.Generic.Mscorlib_CollectionDebugView(managers).Items[0])).ContactDisDetail'抛出异常 of {Object.typeConposed System.ObjectDisposedException}

回复:

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

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

断点的屏幕截图: 虽然错误没有出现在这一点上 - 我可以看到相关实体之一 ContactDetail - 有一些问题要加载

断点

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

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

然后我在控制台中得到 200 ok 和一个 json 对象: json响应

但它不加载相关对象 - 它有一个 NULL 值 - ContactDetail : null

此请求的 SQL 分析器屏幕截图:

SQL 探查器

数据库中数据截图:

数据库中的数据

标签: c#sql-serverentity-framework

解决方案


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

需要修改:

在上下文中禁用延迟加载

语境

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

在存储库中使用预先加载

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

            }
        }
    }
}

在 ContactDetail 类中为虚拟属性添加了[JsonIgnore]属性

public partial class ContactDetail
{
   //other properties
    [JsonIgnore]
    public virtual Manager Manager { get; set; }
}

推荐阅读