一尘不染

循环引用在将对象序列化为JSON时检测到异常

c#

就像这篇文章中提到的那样,我在序列化实体框架代理时遇到了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;
    }
}

阅读 281

收藏
2020-05-19

共1个答案

一尘不染

您的POCO实体可完美序列化。您的问题是EF运行时为您创建的动态代理通常不是。您可以将设置为context.Configuration.ProxyCreationEnabledfalse但是会丢失延迟加载。我强烈建议您使用Json.NET支持EF实体序列化的工具:

ADO.NET实体框架支持意外添加到Json.NET

NET的流行高性能JSON框架

2020-05-19