c# - 从表中获取实体列表会导致 500 错误 - 实体框架
问题描述
我正在 Angular2(前端)和后端 Web API 2 上构建一个 SPA,其中 OWIN 和 Identity 用于身份验证,Ninject 作为 DI 的容器。
我想返回一个经理列表作为 json 响应。还有它相关的 ContactDetail 数据。它们在我的数据库中是一对一相关的。但我收到 500 错误作为响应。为什么我会收到此错误?
经理班
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 对象:
但它不加载相关对象 - 它有一个 NULL 值 - ContactDetail : null
此请求的 SQL 分析器屏幕截图:
数据库中数据截图:
解决方案
感谢@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; }
}
推荐阅读
- google-cloud-platform - 使所有域的名称服务器回复相同
- excel - 如果文件夹名称相同,则替换文件夹
- ruby-on-rails - 音频不适用于heroku上的rails应用程序
- sql - SQL 可行性:可以按值挤出行并以自定义方式组合表吗?
- javascript - 在输入中格式化数字(掩码)
- python - 在 Python 中从字符串中去除非字母字符的代码
- flutter - 如何重建提供者选择器但不重建它们的孩子
- jenkins - 依赖于 Jenkins 构建布尔参数的表达式在管道中不起作用
- ruby-on-rails - Rails:限制用户可以上传的文件数量
- python - 如何将无穷大附加到熊猫 DatetimeIndex