就像这篇文章中提到的那样,我在序列化实体框架代理时遇到了Json序列化错误:
序列化类型为’System.Data.Entity.DynamicProxies.PurchaseOrder_446B939192F161CDBC740067F174F7A6059B0F9C0EEE68CD3EBBD63CF9AF5BD0’的对象时,检测到循环引用。
但是不同之处在于,我的实体中 没有 循环引用,并且 仅 在我们的生产环境中发生。在本地,一切正常…
我的实体:
public interface IEntity { Guid UniqueId { get; } int Id { get; } } public class Entity : IEntity { public int Id { get; set; } public Guid UniqueId { get; set; } } public class PurchaseOrder : Entity { public string Username { get; set; } public string Company { get; set; } public string SupplierId { get; set; } public string SupplierName { get; set; } public virtual ICollection<PurchaseOrderLine> Lines { get; set; } } public class PurchaseOrderLine : Entity { public string Code { get; set; } public string Name { get; set; } public decimal Quantity { get; set; } }
我的PurchaseOrderController上的GetCurrent操作引发异常:
public class PurchaseOrderController : Controller { private readonly IUnitOfWork _unitOfWork; public PurchaseOrderController(IUnitOfWork unitOfWork) { _unitOfWork = unitOfWork; } public JsonResult GetCurrent() { return Json(EnsurePurchaseOrder(), JsonRequestBehavior.AllowGet); } private PurchaseOrder EnsurePurchaseOrder() { var company = RouteData.GetRequiredString("company"); var repository = _unitOfWork.GetRepository<PurchaseOrder>(); var purchaseOrder = repository .Include(p => p.Lines) .FirstOrDefault ( p => p.Company == company && p.Username == User.Identity.Name ); if (purchaseOrder == null) { purchaseOrder = repository.Create(); purchaseOrder.UniqueId = Guid.NewGuid(); purchaseOrder.Company = company; purchaseOrder.Username = User.Identity.Name; _unitOfWork.SaveChanges(); } return purchaseOrder; } }
您的POCO实体可完美序列化。您的问题是EF运行时为您创建的动态代理通常不是。您可以将设置为context.Configuration.ProxyCreationEnabled,false但是会丢失延迟加载。我强烈建议您使用Json.NET支持EF实体序列化的工具:
context.Configuration.ProxyCreationEnabled
false
Json.NET
ADO.NET实体框架支持意外添加到Json.NET
NET的流行高性能JSON框架